home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / demovers / geld_her / sebi_383.gfa (.txt) < prev    next >
GFA-BASIC Atari  |  1998-10-29  |  496KB  |  17,202 lines

  1. ' RTF- Ausgabe noch versuchen zu machen und Bildschirmeditor
  2. ' ===========================================================
  3. demoversion%=FALSE !==> FALSE = Vollversion, für Demoversion TRUE setzen
  4. ' Zu Beginn: angeforderter Speicher
  5. ' Nach allen Dimensionierungen außer Adreß- und Fdgdatenfeldern: verfuegbarer Speicher
  6. $m 716800  ! Bytes _für_die_Variablen_ sparend kompilieren
  7. $E$   ! Fehlermeldungen als Text
  8. IF NOT @compiled
  9.   RESERVE 700*1024
  10.   ON BREAK GOSUB global_exit
  11. ENDIF
  12. ' ' ====================================================================
  13. version$="4.63"        ! wird von Ergo! gelesen und auf Ausdrucke gesetzt
  14. version#=VAL(version$)  ! wird in mehreren Dateien mitabgespeichert für
  15. '                        eventuelle spätere Formatänderungen
  16. version$=STR$(100*version#)  ! muß ohne Komma sein
  17. disknr$="QUVNUW" !PROGRAMMDISKETTE NR.378079  ! muß 6-stellig sein
  18. GOSUB userumwandlung(disknr$,disknr$)
  19. ' ====================================================================
  20. DEFMOUSE 2  ! BIENE
  21. KEYPAD 0                    ! wg Kompatibilität (normale Tastatureinstellung)
  22. ON ERROR GOSUB fehler
  23. ON MENU MESSAGE GOSUB window_event
  24. ON MENU BUTTON 258,3,0 GOSUB button_event  ! Abfrage auf beide Maustasten
  25. ON MENU GOSUB menu_event
  26. ON MENU KEY GOSUB key_event
  27. DIM ftaste$(20)  ! F-Tastenstrings Feld für optionenladen benötigt
  28. boot_pfad$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)
  29. '
  30. ' Wegen Alerts hier schon resource einrichten
  31. @rsc_init
  32. @resource_einrichten(2)  ! 2 Wegen Öffnen des Anfangsbildes (Info)
  33. GOSUB optionenladen
  34. GOSUB variablenvoreinstellung
  35. GOSUB dimensionierungen1
  36. GOSUB mausform(8)
  37. '
  38. ' ab hier: Fenster vorbereiten, öffnen etc.
  39. '
  40. ~GRAF_HANDLE(charw&,charh&,dummy&,dummy&)  ! Aktuelle Zeichenbreite- und Höhe
  41. CONTRL(0)=38  ! Abfrage Textwinkel usw.
  42. CONTRL(1)=0
  43. CONTRL(2)=2
  44. CONTRL(3)=0
  45. CONTRL(4)=6
  46. CONTRL(6)=V~H
  47. VDISYS
  48. charpixw&=PTSOUT(0)  ! Zeichenbreite
  49. charpixh&=PTSOUT(1)  ! Zeichenhöhe
  50. '
  51. ' init_winlib: 1. Zahl ist Anzahle der vom PRG benötigten Windows
  52. @init_winlib(3,"[3][Es kann kein Fenster mehr|geöffnet werden. Abhilfe:|schliessen Sie eines!][OK]")
  53. '
  54. ' ## INLINE:
  55. ' $0000: 20 47 65 6c 64 5f 68 65 72 20 21 20 00 52 41 55 
  56. ' $0010: 43 48 20 00 74 20 00 00 20 00 00 00 00 00 00 00 
  57. ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  58. ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  59. ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  60. ' $0050: 20 4e 52 2e 20 20 44 41 54 55 4d 20 20 20 20 20 
  61. ' $0060: 48 41 55 50 54 46 44 47 20 20 20 20 4b 4f 53 54 
  62. ' $0070: 45 4e 20 20 20 20 5a 49 4e 53 45 4e 20 20 4b 2d 
  63. ' $0080: 5a 49 4e 53 20 41 4e 4d 45 52 4b 55 4e 47 45 4e 
  64. ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  65. ' $00a0: 20 47 65 6c 64 5f 68 65 72 20 21 20 00 00 00 00 
  66. ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  67. ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  68. ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  69. ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  70. ' $00f0: 20 4e 52 2e 20 20 44 41 54 55 4d 20 20 20 20 20 
  71. ' $0100: 48 41 55 50 54 46 44 47 20 20 20 20 4b 4f 53 54 
  72. ' $0110: 45 4e 20 20 20 20 5a 49 4e 53 45 4e 20 20 4b 2d 
  73. ' $0120: 5a 49 4e 53 20 41 4e 4d 45 52 4b 55 4e 47 45 4e 
  74. ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  75. ' $0140: 20 33 20 2f 20 41 75 73 67 61 62 65 20 00 00 00 
  76. ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  77. ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  78. ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  79. ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  80. ' 400  Bytes.
  81. INLINE titles%,400
  82. CHAR{titles%}=" Geld_her ! "
  83. CHAR{titles%+80}=" NR.  DATUM     HAUPTFDG    KOSTEN    ZINSEN  K-ZINS ANMERKUNGEN"
  84. '
  85. DIM xwin%(3),ywin%(3),wwin%(3),hwin%(3),hoff%(3),voff%(3)  ! max. 3 Fenster
  86. '
  87. RESTORE fensterpos
  88. fensterpos:
  89. DATA 0,0,1000000,1000000,0,0
  90. ' x, y, w, h,h-offset,v-offset
  91. '
  92. i&=0  ! Fensternummer
  93. READ xwin%(i&),ywin%(i&),wwin%(i&),hwin%(i&),hoff%(i&),voff%(i&)
  94. '
  95. IF EXIST(boot_pfad$+"\PRT\GELD_HER.WIN")  ! Gespeicherte Fensterdaten
  96.   OPEN "I",#1,boot_pfad$+"\PRT\GELD_HER.WIN"
  97.   FOR i&=0 TO 3
  98.     INPUT #1,xwin%(i&),ywin%(i&),wwin%(i&),hwin%(i&),hoff%(i&),voff%(i&)
  99.   NEXT i&
  100.   CLOSE #1
  101. ENDIF
  102. '
  103. GOSUB diskontsaetze_laden
  104. GOSUB nachtexte_laden  ! Nachtexte werden geladen
  105. '
  106. GOSUB dimensionierungen2
  107. '
  108. @oeffne_fenster(0,1)
  109. @redraw_part(0,0)  ! Damit Fenster weiß gefüllt wird
  110. '
  111. '
  112. '
  113. ' ++++++++++++++++++++++++++++++++++++++
  114. @resource_einrichten(2)  ! 2 Wegen Öffnen des Anfangsbildes (Info)
  115. GOSUB anfangsbild_oeffnen
  116. GOSUB datenbank_laden(TRUE)
  117. GOSUB druckerladen(1)  ! STANDARDDRUCKER WIRD GELADEN
  118. GOSUB anfangsbild_schliessen
  119. @resource_einrichten(1) ! Da Anfangsbild wieder geschlossen ist
  120. ' GOSUB termine_laden
  121. @open_drucker
  122. DEFMOUSE 0
  123. IF demoversion%=TRUE
  124.   dummy%=@rsc_alert(1,"Geld_her! 4.6 Demoversion|Nur 10 Buchungszeilen möglich|MBs nur bis DM 1000.-"," [OK ",1)
  125. ENDIF
  126. DO
  127.   ON MENU
  128. LOOP
  129. END
  130. '
  131. ' ********************
  132. PROCEDURE history
  133.   ' V 1.0 erste fertige Version
  134.   ' v 2.0 Oberfläche geändert (Radiobuttons, Checkboxex
  135.   ' v 2.0 Normale MBs integriert
  136.   ' v 3.0 Computer-Mbs integriert
  137.   ' V 4.0 Datenbank für Adressen integriert
  138.   ' V 4.2 Es können nun alle Vorgänge über eine Bibliothek erstellt werden *.MSB
  139.   ' V 4.21 in Box Zusatzeingaben kann anhalten für Einlegen von Briefköpfen gewählt werden
  140.   ' V 4.25 Die Datenbank unterscheidet nach Mdt, AG und Obergerichten
  141.   ' V 4.5 Dia Adressen aller deutschen Amtsgerichte werden mitgeliefert und
  142.   ' die Datenbank sucht bei Aufruf auch mit * und ? Option und Weitersuchen
  143.   ' wenn schon ein Datensatz angezeigt wird
  144.   ' V 4.61 Konvertierung zu RA-PC und Windowsdateien ist möglich
  145.   ' V 4.62 Speichereinteilung für Buchungszeilen und Datensätze variabel
  146.   ' 4.63 kleinere Fehlerbeseitigungen
  147. RETURN
  148. ' ****************************************************
  149. > PROCEDURE aenderungen  ! Enthält Anmerkungen
  150.   ' Ab RA_ST689 Menü im Resourcefile
  151.   ' Shortcuts und Menüeinträge von jedem mit RCS veränderbar
  152.   ' Aufpassen bei Änderung: Doppelumschalttasten: Pfeil-hoch zuerst; 1 Leerzeichen vor Shortcut
  153.   ' laden + speichern wg geändertem Datenformat (auch optionen)
  154.   ' Mahnverfahrensprogramme
  155.   ' Dialogboxpositionierung und Speichern derselben
  156.   ' scheckzinsen+summenbildung+verrechnung wg. Scheckzinsen
  157.   ' ACHTUNG !!! in Procedure Summenbildung Änderung wg. Scheckzinsen vgl.
  158.   ' besonderen Hinweis in der Subroutine
  159.   ' Zinsrechner
  160.   ' Scheckzinsberechnung und Diskontsatzeingabe
  161.   ' termine_laden (neu)
  162.   ' termine_speichern (neu)
  163.   ' termine_selektieren (neu, Auswahlkriterien der Terminsliste)
  164.   ' tag_im_jahr (neu)
  165.   ' tag_absolut (neu)
  166.   ' welcher_wochentag(neu)
  167.   ' daten_aufspalten (neu)
  168.   ' datumsstring_erstellen (neu)
  169.   ' daten_differenz (neu)
  170.   ' datums_rueckumwandlung (neu) NICHT VERWECHSELN MIT DATUMSUMWANDLUNG !!!
  171.   ' datums_addition
  172.   ' BEGONNEN MIT TERMINSLISTE FÜR 1500 TERMINE. DIE TERMINSDATEN
  173.   ' BLEIBEN NUR AUF DISKETTE/HD (#2). IM SPEICHER WERDEN NUR DIE INDICES DER
  174.   ' DATENSÄTZE, D.H. DIE REIHENFOLGE AUF DER HD ÜBERWACHT UND AKTUALISIERT (FELD T)
  175.   ' NEUERUNG !!! Alle Menüs per Tastendruck erreichbar
  176.   ' Außerdem weniger Dialogboxen, sondern eine große für GL, Sch und Titeldaten
  177.   ' globale Variable Abbruch um bei Anwahl von Abbruchbuttons in
  178.   ' Dialogboxen durch nachfolgende Prozeduren durchzuschleifen
  179.   ' Tageszinsen nicht mehr im Feld, sondern global
  180.   ' Felder in Einzelfelder aufgeteilt >> Einfügen und löschen geht mit INSERT/DELETE
  181. RETURN
  182. ' *********************************************************
  183. > PROCEDURE variableninfos  ! Erläutert die Variablen/Felder
  184.   '  seitennrjustierung%:  ! 0=links, 1=Mitte, 2=rechts
  185.   '
  186.   ' +++ FELD A(i%,1234) +++
  187.   ' betrag(i%)=Betrag
  188.   ' restbetrag(i%)=Restbetrag
  189.   ' zinssatz(i%)=Zinssatz
  190.   ' fdgart(i%)=Forderungsart
  191.   '
  192.   ' +++ FELD A$(i%,1234) +++
  193.   ' fdgdatum%(i%)=Forderungsdatum
  194.   ' zinsdatum%(i%)=Zinsdatum
  195.   '
  196.   ' +++ VARIABLE wasdrucken% +++
  197.   ' 1= § 367
  198.   ' 2= ZVA
  199.   ' 3= PfÜb
  200.   ' 4= EV-Antrag
  201.   ' 5= Pfändung+Verhaftg
  202.   ' 6= Durchsuchungsantrag
  203.   ' 7= Zahlungsverbot
  204.   ' 8= 840 ZPO
  205.   ' 9= Postanfrage
  206.   ' 10= EMA
  207.   ' 11= ZV-Androhung
  208.   ' 12= Ratenvergleich
  209.   ' 13= SicherungsHypothek
  210.   ' 14= Sicherungsvollstreckung
  211.   ' 15= Verhaftung (ohne Pfdg)
  212.   ' 16= EV-Ergänzung
  213.   ' 17= EV-erneute Abgabe
  214.   ' 28= Musterbibliotheksvorgang
  215.   ' 29 = Kurzdruck
  216.   ' 30 = Mahnbescheid
  217.   ' 31 = VB
  218.   ' 32=Computer-MB
  219.   '
  220.   ' +++ MUSTERTEXTE IM ORDNER PRT\MUSTER +++
  221.   ' 367.MST
  222.   ' DURCHSUC.MST
  223.   ' EV.MST
  224.   ' EV_ERGNZ.MST
  225.   ' EV_NEU.MST
  226.   ' ZVA.MST
  227.   ' PFUEB.MST
  228.   ' PFVERH.MST
  229.   ' ZAHLVERB.MST
  230.   '  ZPO_840.MST
  231.   ' POSTANFR.MST
  232.   ' EMA.MST
  233.   ' ZV_DROHG.MST
  234.   ' RATENVGL.MST
  235.   ' SICHHYPO.MST
  236.   ' SICHVSTR.MST
  237.   ' VERHAFTG.MST
  238.   ' MB.MST
  239.   ' CMB.MST
  240.   '
  241.   ' +++ ANSPRUCHSARTEN IM ORDNER PRT\ANSPRUCH +++
  242.   ' ARBEITSA.TXT
  243.   ' ARBGEBER.TXT
  244.   ' BANK.TXT
  245.   ' FINNZAMT.TXT
  246.   ' LEBENSVS.TXT
  247.   ' RENTE.TXT
  248.   ' WERKLOHN.TXT
  249.   ' ANDERES.TEXT  (RESIDENT, ABER FREI DEFINIERBAR)
  250.   '
  251.   ' +++ SCHLÜSSELWÖRTER VGL PROCEDURE KEYWORD_AUSWERTEN +++
  252.   '
  253. RETURN
  254. ' **************************************************************
  255. > PROCEDURE termin_menutitel_infos  ! INFOS über Terminteil
  256.   ' so müssen die titel des menüs termine heißen
  257.   LET toeffnen&=38 ! STRING in Baum H_MENU
  258.   LET tschlies&=39 ! STRING in Baum H_MENU
  259.   LET teingebe&=40 ! STRING in Baum H_MENU
  260.   LET tloesch&=41 ! STRING in Baum H_MENU
  261.   LET tselekt&=42 ! STRING in Baum H_MENU
  262.   LET tkolliss&=43 ! STRING in Baum H_MENU
  263.   LET tdrucken&=45 ! STRING in Baum H_MENU
  264. RETURN
  265. ' **********************************************************+
  266. '
  267. ' =====================================================
  268. ' VOREINSTELLUNGEN UND EINRICHTUNGEN
  269. ' =====================================================
  270. ' ***************************************************************
  271. > PROCEDURE dimensionierungen1
  272.   '  DIM t(1500) ! INDEXFELD FÜR DIE TERMINE
  273.   DIM muster$(32)  ! HIER SIND DIE TEXTMUSTER ENTHALTEN; INDEX=WASDRUCKEN
  274.   DIM diskont#(200,2)
  275.   DIM anspruch$(10)  ! Anspruchsbezeichnungen, Index=welcher_anspruch%
  276.   ' Das Feld diskont enthält das Datum(absolut) als (i%,1) und den Zinssatz in % (i%,2)
  277.   ' Gebührenrechner
  278.   DIM gebuehrentexte$(5,10)
  279.   DIM ausgabebetraege#(40)
  280.   DIM ausgabe$(40)
  281.   DIM reg%(15)  ! von Datenbankfunktion instr benötigt
  282. RETURN
  283. ' **************************************************************
  284. > PROCEDURE dimensionierungen2  ! Adreß- und Forderungsfelder
  285.   ' Beim Optionenladen erhält maximalbuchungen% und max_adr% die Werte wie
  286.   ' geladen oder als Voreinstellung 1500 ==> für Demo einschränken
  287.   '
  288.   ' Dimensionierung gemäß Einstellungen
  289.   IF demoversion%=TRUE
  290.     maximalbuchungen%=20
  291.   ENDIF
  292.   '
  293.   verfuegbarer_speicher%=FRE(0)  ! =Speicherrest _nach_ Bestückung aller
  294.   ' Hilfsfelder, d.h. verfügbar für Adreß und Datenfelder
  295.   '
  296.   ' Test, ob Speicher reicht
  297.   ' Alle Felder außer Adreß- und Datenbank sind schon dimensioniert _und_ gefüllt !
  298.   ' Speicherbedarf bei Voreinstellung max_adr% und maximalbuchungen%
  299.   ' Datenbank: 8 String- und 1 Integerfeld
  300.   ' Fdg-Berechnungen: 2 Integer-, 5 Real- und 2 Stringfelder (1 vernachlässigbar da nur Extra-Forderungsnamen)
  301.   '
  302.   '
  303.   db_name$=boot_pfad$+"\PRT\ADRESSEN\GELD_HER.ADR"
  304.   IF EXIST(db_name$)=TRUE
  305.     OPEN "I",#1,db_name$
  306.     adressdateilaenge%=LOF(#1)
  307.     CLOSE #1
  308.   ELSE
  309.     dummy%=@rsc_alert(1,"Die Adressdatei|GELD_HER.ADR|existiert nicht !","[Abbruch",1)
  310.   ENDIF
  311.   '
  312.   '
  313. speicherbedarf_testen:
  314.   adressspeicher%=8*(12+10*(max_adr%+1))+adressdateilaenge%+1*(12+6*(max_adr%+1))
  315.   forderungsberechnungsspeicher%=2*(12+6*(maximalbuchungen%+1))+8*(12+8*(maximalbuchungen%+1))
  316.   ADD forderungsberechnungsspeicher%,12+10*(maximalbuchungen%+1)+(maximalbuchungen#+1)*80+(12+10*(maximalbuchungen%+1))  ! forderungstextfeld max ca. 80 Zeichen alng und Forderungsartfeld
  317.   ' Gesamtspeicherbedarf incl. 50.000 Bytes für sonstiges wie Temporärfelder
  318.   ' ohne Hintergrundrettung, da die über MALLOC im Systemspeicher läuft
  319.   gesamtspeicherbedarf%=adressspeicher%+forderungsberechnungsspeicher%+50000
  320.   IF gesamtspeicherbedarf%>verfuegbarer_speicher%
  321.     dummy%=@rsc_alert(1,"Zu große Werte für|Adressen- und Daten-|bereiche eingestellt.|Bitte ändern !"," [OK ",1)
  322.     @speichereinteilung  ! neue Werte einstellen
  323.     GOTO speicherbedarf_testen
  324.   ENDIF
  325.   '
  326.   DIM dbart%(max_adr%+1),dbvorname$(max_adr%+1),dbnachname$(max_adr%+1),dbstrasse$(max_adr%+1)
  327.   DIM dbplzort$(max_adr%+1),dbgf$(max_adr%+1),dbtel$(max_adr%+1),dbfax$(max_adr%+1)
  328.   DIM dbkuerzel$(max_adr%+1)
  329.   DIM fdgtxt$(maximalbuchungen%+5)  ! + 5 wegen Tageszinsenzeile
  330.   DIM fdgname$(maximalbuchungen%+2)  ! Hilfsfeld, etwas unschön da
  331.   ' es nur bei fdgart%=14 (popup) die Klartexteinträge der Forderungsart enthält
  332.   ' andernfalls hätte man die fdgarten insgesamt erweitern müssen ...
  333.   DIM betrag#(maximalbuchungen%+2),restbetrag#(maximalbuchungen%+2)
  334.   DIM zinssatz#(maximalbuchungen%+2),fdgart#(maximalbuchungen%+2+2),kzins#(maximalbuchungen%+2)
  335.   DIM fdgdatum%(maximalbuchungen%+2),zinsdatum%(maximalbuchungen%+2)
  336. RETURN
  337. ' **************************************************************
  338. > PROCEDURE variablenvoreinstellung
  339.   IF demoversion%=TRUE
  340.     maximalbuchungen%=20
  341.   ENDIF
  342.   '
  343.   ' DRUCKERVOREINSTELLUNGEN
  344.   cpi#=10 !Muß IMMER ANGEGEBEN SEIN
  345.   '
  346.   ' SONSTIGE VOREINSTELLUNGEN
  347.   GOSUB datum_aufspalten(DATE$,t%,m%,j%)
  348.   GOSUB tag_absolut(t%,m%,j%,abrechnungsdatum%)
  349.   optionsaenderung%=FALSE
  350.   aufstellungsaenderung#=FALSE  ! jede Änderung erhöht um 1
  351.   voreinstellungsdateiname$="RA_ST.DAT"  ! Voreinstellung fileselectbox
  352.   mitmwst%=1
  353.   mb_mitmwst%=1
  354.   mb_agzahl%=1
  355.   mb_aszahl%=1
  356.   aktuelle_druckzeile%=1
  357.   seitennummer%=1
  358. RETURN
  359. ' ***********************************************************
  360. > PROCEDURE userumwandlung(userdaten$,VAR r$)
  361.   r$=""
  362.   l%=LEN(userdaten$)
  363.   FOR i%=1 TO l%
  364.     buchstabe$=MID$(userdaten$,i%,1)
  365.     buchstabennr#=ASC(buchstabe$)-30
  366.     IF buchstabennr#<0
  367.       ADD buchstabennr#,255
  368.     ENDIF
  369.     r$=r$+CHR$(buchstabennr#)
  370.   NEXT i%
  371. RETURN
  372. ' ****************************************************************
  373. '
  374. ' ==============================================================
  375. ' MAUSFORM + ALERTS
  376. ' ============================================================
  377. ' ********************************************************************
  378. > PROCEDURE mausform(index%)
  379.   SELECT index%
  380.   CASE 0 TO 7  ! Eingebaute Formen
  381.     ~GRAF_MOUSE(index%,0)
  382.   CASE 8  ! Diskette
  383.     m$=MKI$(0)+MKI$(0)+MKI$(1)+MKI$(0)+MKI$(1)  ! Mouseheader
  384.     RESTORE diskettenmaus
  385.     FOR i%=6 TO 37
  386.       READ x%
  387.       m$=m$+MKI$(x%)
  388.     NEXT i%
  389.     ~GRAF_MOUSE(255,VARPTR(m$))
  390.   diskettenmaus:
  391.     ' Hintergrund
  392.     DATA 65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535
  393.     ' Bildmuster
  394.     DATA 0,32766,32754,32766,32766,32766,32766,32766,32766,32766,28686,30222,30222,30222,16382,0
  395.   CASE 9  ! Kaffeetasse
  396.     m$=MKI$(0)+MKI$(0)+MKI$(1)+MKI$(0)+MKI$(1)  ! Mouseheader
  397.     RESTORE kaffeetasse
  398.     FOR i%=6 TO 37
  399.       READ x%
  400.       m$=m$+MKI$(x%)
  401.     NEXT i%
  402.     ~GRAF_MOUSE(255,VARPTR(m$))
  403.   kaffeetasse:
  404.     ' Hintergrund
  405.     DATA 65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535
  406.     ' Bildmuster
  407.     DATA 0,4424,2384,2640,0,4032,12348,12242,8210,8220,4128,10320,18312,12336,4032,0
  408.   DEFAULT
  409.     ~GRAF_MOUSE(0,0)
  410.   ENDSELECT
  411. RETURN
  412. ' ***************************************************************************
  413. '
  414. ' =================================================
  415. ' Datenbank
  416. ' ==============================================
  417. '
  418. ' **************************************************
  419. > PROCEDURE datenbank(such$,tree&,obj&,art%)
  420.   ' art%: 1=Mandanten, 2=Amtsgerichte, 3=Obergerichte
  421.   datenbankbaum_adr%=rsc_adr%(datenbankbaum&)
  422.   @dialog_positionieren(datenbankbaum&)
  423.   @rsc_write_popup(datenbankbaum&,dbkartpopup&,MAX(art%,1))
  424.   @datenbankmaske_initialisieren(FALSE)  ! ohne redraw
  425.   IF tree&<=0 ! kein Aufruf aus einer Dialogbox => "Eintragen" deaktivieren
  426.     @set_flag(datenbankbaum_adr%,dbkspeichern&,&H2) ! Defaultbutton
  427.     @del_flag(datenbankbaum_adr%,dbkeintragen&,&H2) ! kein Defaultbutton
  428.     @do_objc(datenbankbaum_adr%,dbkeintragen&,&H8) ! helle Darstellung
  429.   ELSE
  430.     @del_flag(datenbankbaum_adr%,dbkspeichern&,&H2) ! kein Defaultbutton
  431.     @set_flag(datenbankbaum_adr%,dbkeintragen&,&H2) ! Defaultbutton
  432.     @undo_objc(datenbankbaum_adr%,dbkeintragen&,&H8) ! normale Darstellung
  433.   ENDIF
  434.   @rsc_draw(datenbankbaum&,fensterdial%)
  435.   dummy%=@namen_suchen(such$,1)
  436.   IF dummy%>0
  437.     @datensatz_anzeigen(dummy%,FALSE)
  438.   ENDIF
  439.   erstes_objekt%=dbkvorname&
  440.   DO
  441.     ex_obj%=@rsc_do(datenbankbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  442.     SELECT ex_obj%
  443.     CASE dbkdatensatz&
  444.       @datenbankmaske_initialisieren(TRUE)
  445.     CASE dbkdown&
  446.       a%=VAL(CHAR{{OB_SPEC(datenbankbaum_adr%,dbkdatensatz&)}})
  447.       @datensatz_anzeigen(@naechster_datensatz(a%,@rsc_read_popup(datenbankbaum&,dbkartpopup&),-1),TRUE)
  448.     CASE dbkup&
  449.       a%=VAL(CHAR{{OB_SPEC(datenbankbaum_adr%,dbkdatensatz&)}})
  450.       @datensatz_anzeigen(@naechster_datensatz(a%,@rsc_read_popup(datenbankbaum&,dbkartpopup&),1),TRUE)
  451.     CASE dbkspeichern&
  452.       db_aenderung%=TRUE
  453.       a%=@datensatzposition(CHAR{{OB_SPEC(datenbankbaum_adr%,dbknachname&)}},CHAR{{OB_SPEC(datenbankbaum_adr%,dbkvorname&)}})
  454.       IF @datensatz_einfuegen(a%)=TRUE  ! Dann wurde Datensatz übernommen
  455.         @datenbankmaske_initialisieren(TRUE)
  456.       ENDIF
  457.       @select(datenbankbaum_adr%,ex_obj%,FALSE)
  458.       @objc_update(datenbankbaum_adr%,ex_obj%)
  459.     CASE dbkaendern&
  460.       db_aenderung%=TRUE
  461.       @datensatz_loeschen(VAL(CHAR{{OB_SPEC(datenbankbaum_adr%,dbkdatensatz&)}}))
  462.       a%=@datensatzposition(CHAR{{OB_SPEC(datenbankbaum_adr%,dbknachname&)}},CHAR{{OB_SPEC(datenbankbaum_adr%,dbkvorname&)}})
  463.       IF @datensatz_einfuegen(a%)=TRUE  ! Dann wurde Datensatz übernommen
  464.         @datenbankmaske_initialisieren(TRUE)
  465.       ENDIF
  466.       @select(datenbankbaum_adr%,ex_obj%,FALSE)
  467.       @objc_update(datenbankbaum_adr%,ex_obj%)
  468.     CASE dbkloeschen&
  469.       db_aenderung%=TRUE
  470.       @datensatz_loeschen(VAL(CHAR{{OB_SPEC(datenbankbaum_adr%,dbkdatensatz&)}}))
  471.       @datenbankmaske_initialisieren(TRUE)
  472.       @select(datenbankbaum_adr%,ex_obj%,FALSE)
  473.       @objc_update(datenbankbaum_adr%,ex_obj%)
  474.     CASE dbkeintragen&
  475.       @daten_einsetzen(tree&,obj&,VAL(CHAR{{OB_SPEC(datenbankbaum_adr%,dbkdatensatz&)}}))
  476.       @select(datenbankbaum_adr%,ex_obj%,FALSE)
  477.     CASE dbksuchen&
  478.       IF @selected(datenbankbaum_adr%,dbkdatensatz&)=FALSE  ! schon einer angezeigt,
  479.         ' Suchkriterium muß nicht neu ermittelt werden, weitersuchen ab aktuellem Datensatz+1
  480.         a%=@namen_suchen(suchkriterium$,VAL(CHAR{{OB_SPEC(datenbankbaum_adr%,dbkdatensatz&)}})+1)
  481.       ELSE
  482.         ' Suchkriterium neu abfragen und bei Datensatz 1 mit Suche beginnen
  483.         suchkriterium$=CHAR{{OB_SPEC(datenbankbaum_adr%,dbknachname&)}}
  484.         a%=@namen_suchen(suchkriterium$,1)
  485.       ENDIF
  486.       IF a%>0
  487.         @datensatz_anzeigen(a%,TRUE)  ! mit redraw
  488.       ELSE
  489.         ~@rsc_alert(1,"Kein Datensatz erfüllt|das Suchkriterium !","[Abbruch",1)
  490.       ENDIF
  491.       @select(datenbankbaum_adr%,ex_obj%,FALSE)
  492.       @objc_update(datenbankbaum_adr%,ex_obj%)
  493.     ENDSELECT
  494.   LOOP UNTIL ex_obj%=dbkeintragen& OR ex_obj%=dbkabbruch&
  495.   '
  496.   ' Beenden des Dialogs
  497.   rsc_back(datenbankbaum&)
  498.   @select(datenbankbaum_adr%,ex_obj%,FALSE)
  499.   ' Dialog beendet
  500. datenbank_ende:
  501. RETURN
  502. ' ************************************************************
  503. > FUNCTION naechster_datensatz(alt%,typ%,richtung%)
  504.   ' Sucht nächsten Datensatz der gleichen Datenart aufwärts/abwärts
  505.   LOCAL i%
  506.   SELECT richtung%
  507.   CASE 1  ! aufwärts suchen
  508.     IF dbart%(alt%)>0  ! nur Blätter, wenn noch kein leerer Datensatz
  509.       FOR i%=alt%+1 TO max_adr%
  510.         EXIT IF dbart%(i%)=typ% OR dbart%(i%)=0  ! Null=leerer Datensatz
  511.       NEXT i%
  512.     ELSE  !x leere Satz schon angezeigt
  513.       i%=alt%
  514.     ENDIF
  515.   CASE -1  !abwärts suchen
  516.     FOR i%=alt%-1 DOWNTO 1
  517.       EXIT IF dbart%(i%)=typ%
  518.     NEXT i%
  519.     IF i%=0
  520.       i%=alt%
  521.     ENDIF
  522.   ENDSELECT
  523.   RETURN i%
  524. ENDFUNC
  525. ' ***********************************************************+
  526. > PROCEDURE datenbankmaske_initialisieren(redraw%)  ! für Neueingabe vorbereiten
  527.   LOCAL i%
  528.   FOR i%=1 TO max_adr%
  529.     EXIT IF dbnachname$(i%)=""  ! dann leerer Satz, also Neueingabe
  530.   NEXT i%
  531.   @select(datenbankbaum_adr%,dbkdatensatz&,TRUE) ! Zum Anzeigen der Eingabebereitschaft
  532.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkdatensatz&)}}=STR$(i%)
  533.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkvorname&)}}=""
  534.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbknachname&)}}=""
  535.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkstrasse&)}}=""
  536.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkplzort&)}}=""
  537.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkgf&)}}=""
  538.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbktel&)}}=""
  539.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkfax&)}}=""
  540.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkkuerzel&)}}=""
  541.   IF redraw%=TRUE
  542.     FOR i%=dbkdatensatz& TO dbkkuerzel&
  543.       @objc_update(datenbankbaum_adr%,i%)
  544.     NEXT i%
  545.   ENDIF
  546. RETURN
  547. ' *************************************************************
  548. > PROCEDURE datensatz_anzeigen(nr%,redraw%)
  549.   IF dbnachname$(nr%)<>""
  550.     @select(datenbankbaum_adr%,dbkdatensatz&,FALSE) ! Zum Anzeigen existenter Sätze
  551.   ELSE
  552.     @select(datenbankbaum_adr%,dbkdatensatz&,TRUE) ! Zum Anzeigen der Eingabebereitschaft
  553.   ENDIF
  554.   IF dbart%(nr%)>0
  555.     @rsc_write_popup(datenbankbaum&,dbkartpopup&,dbart%(nr%))
  556.   ENDIF
  557.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkdatensatz&)}}=STR$(nr%)
  558.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkvorname&)}}=dbvorname$(nr%)
  559.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbknachname&)}}=dbnachname$(nr%)
  560.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkstrasse&)}}=dbstrasse$(nr%)
  561.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkplzort&)}}=dbplzort$(nr%)
  562.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkgf&)}}=dbgf$(nr%)
  563.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbktel&)}}=dbtel$(nr%)
  564.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkfax&)}}=dbfax$(nr%)
  565.   CHAR{{OB_SPEC(datenbankbaum_adr%,dbkkuerzel&)}}=dbkuerzel$(nr%)
  566.   IF redraw%=TRUE
  567.     @objc_update(datenbankbaum_adr%,dbkartpopup&)
  568.     FOR i%=dbkdatensatz& TO dbkkuerzel&
  569.       @objc_update(datenbankbaum_adr%,i%)
  570.     NEXT i%
  571.   ENDIF
  572. RETURN
  573. ' **************************************************************
  574. > FUNCTION datensatz_einfuegen(i%)
  575.   ' Testen, ob Kürzel aus der Dialogbox schon vergeben ist; es muß eindeutig sein
  576.   IF @kuerzel_suchen(CHAR{{OB_SPEC(datenbankbaum_adr%,dbkkuerzel&)}})>0
  577.     ~@rsc_alert(1,"Das eingegebene Kürzel|ist nicht eindeutig !|Bitte abändern. Der Daten-|satz wurde nicht übernommen !"," [OK ",1)
  578.     RETURN FALSE
  579.   ELSE  ! sonst Element einfügen
  580.     INSERT dbart%(i%)=@rsc_read_popup(datenbankbaum&,dbkartpopup&)
  581.     INSERT dbvorname$(i%)=CHAR{{OB_SPEC(datenbankbaum_adr%,dbkvorname&)}}
  582.     INSERT dbnachname$(i%)=CHAR{{OB_SPEC(datenbankbaum_adr%,dbknachname&)}}
  583.     INSERT dbstrasse$(i%)=CHAR{{OB_SPEC(datenbankbaum_adr%,dbkstrasse&)}}
  584.     INSERT dbplzort$(i%)=CHAR{{OB_SPEC(datenbankbaum_adr%,dbkplzort&)}}
  585.     INSERT dbgf$(i%)=CHAR{{OB_SPEC(datenbankbaum_adr%,dbkgf&)}}
  586.     INSERT dbtel$(i%)=CHAR{{OB_SPEC(datenbankbaum_adr%,dbktel&)}}
  587.     INSERT dbfax$(i%)=CHAR{{OB_SPEC(datenbankbaum_adr%,dbkfax&)}}
  588.     INSERT dbkuerzel$(i%)=CHAR{{OB_SPEC(datenbankbaum_adr%,dbkkuerzel&)}}
  589.     RETURN TRUE
  590.   ENDIF
  591. ENDFUNC
  592. ' ***********************************************************
  593. > PROCEDURE datensatz_loeschen(i%)
  594.   DELETE dbart%(i%)
  595.   DELETE dbvorname$(i%)
  596.   DELETE dbnachname$(i%)
  597.   DELETE dbstrasse$(i%)
  598.   DELETE dbplzort$(i%)
  599.   DELETE dbgf$(i%)
  600.   DELETE dbtel$(i%)
  601.   DELETE dbfax$(i%)
  602.   DELETE dbkuerzel$(i%)
  603. RETURN
  604. ' ***********************************************************
  605. > FUNCTION kuerzel_suchen(k$)
  606.   LOCAL i%
  607.   IF k$<>""
  608.     FOR i%=1 TO max_adr%
  609.       IF dbkuerzel$(i%)=k$
  610.         RETURN i%
  611.       ENDIF
  612.     NEXT i%
  613.   ENDIF
  614.   IF i%>max_adr% OR k$="" ! Dann Schleife zu Ende geführt + nix gefunden
  615.     RETURN FALSE
  616.   ENDIF
  617. ENDFUNC
  618. ' *************************************************************
  619. > FUNCTION namen_suchen(k$,abnr%)
  620.   LOCAL i%
  621.   IF LEN(k$)>0
  622.     FOR i%=abnr% TO max_adr%
  623.       IF @instr(dbnachname$(i%),k$,1,dummy&)>0
  624.         RETURN i%
  625.       ENDIF
  626.     NEXT i%
  627.   ENDIF
  628.   IF i%>max_adr% OR k$="" ! Dann Schleife zu Ende geführt + nix gefunden
  629.     RETURN FALSE
  630.   ENDIF
  631. ENDFUNC
  632. ' **************************************************************
  633. > FUNCTION instr(a$,b$,a&,VAR len&)
  634. ' ## INLINE:
  635. ' $0000: 4a 47 66 02 7e 01 28 58 2a 59 30 10 32 11 4a 40 
  636. ' $0010: 67 74 4a 41 67 70 28 0c d8 80 53 84 2a 0d da 81 
  637. ' $0020: 53 85 24 0c d4 87 55 82 b8 82 65 56 20 42 52 88 
  638. ' $0030: 24 08 24 4d 53 8a 22 4a 52 89 1e 10 be 11 67 12 
  639. ' $0040: 0c 11 00 3f 67 0c 2c 49 53 8e 0c 16 00 2a 66 10 
  640. ' $0050: 60 02 52 89 52 88 b8 88 65 06 ba 89 65 02 60 da 
  641. ' $0060: 0c 11 00 2a 66 02 24 49 b8 88 65 0c ba 89 65 08 
  642. ' $0070: 0c 12 00 2a 66 02 60 be b8 88 65 06 ba 89 65 02 
  643. ' $0080: 60 a6 ba 89 65 04 70 00 60 1a 94 8c 52 82 20 02 
  644. ' $0090: 2a 45 0c 15 00 2a 66 04 20 44 52 88 91 cc 22 08 
  645. ' $00a0: 92 40 52 41 4e 75 
  646. ' 166  Bytes.
  647.   INLINE instr_asm%,166
  648.   ' INSTR mit Wildcards '*' und '?'...
  649.   '  PRINT @instr("Das ist ein Testtext ohne Sinn","T*st",1,l&)
  650.   $F%
  651.   '
  652.   reg%(8)=*a$            ! A0 -> Zu durchsuchender String
  653.   reg%(9)=*b$            ! A1 -> Zu suchender String
  654.   '
  655.   reg%(7)=a&             ! D7 -> Startposition
  656.   '
  657.   RCALL instr_asm%,reg%()
  658.   '
  659.   len&=reg%(1)           ! Länge des gefundenen Textstückes
  660.   '
  661.   RETURN reg%(0)         ! Gefundene Position zurück
  662. ENDFUNC
  663. ' *************************************************************
  664. > FUNCTION datensatzposition(nn$,vn$)
  665.   LOCAL i%
  666.   ' Deutsche Sonderzeichen ersetzen damit richtige Position erkannt werden kann
  667.   nn$=@datensatz_umwandeln$(nn$)
  668.   vn$=@datensatz_umwandeln$(vn$)
  669.   '
  670.   ' Position des ersten Datensatzes oberhalb "A" herausfinden, da ca. 800 Amtsgerichte
  671.   IF bpos%=0
  672.     DO
  673.       INC bpos%
  674.       EXIT IF LEFT$(UPPER$(dbnachname$(bpos%)))>"A"
  675.     LOOP
  676.   ENDIF
  677.   '
  678.   SELECT ASC(LEFT$(nn$))
  679.   CASE 66 TO 90,98 TO 122,148,153,129,154  ! Alles außer a und ä, Ä und A
  680.     anfang%=bpos%  ! Amtsgerichte überspringen
  681.   DEFAULT
  682.     anfang%=1
  683.   ENDSELECT
  684.   '
  685.   '
  686.   ' Erst nur nach ersten Buchstaben suchen, geht schneller
  687.   FOR anfang%=anfang% TO max_adr%
  688.     SELECT ASC(LEFT$(dbnachname$,anfang%))
  689.     CASE 65 TO 90,97 TO 122
  690.       dummy%=ASC(UPPER$(LEFT$(dbnachname$(anfang%)))) ! Großbuchstaben
  691.     CASE 132,142  ! Ä und ä
  692.       dummy%=65   ! großes A
  693.     CASE 148,153  ! Ö und ö
  694.       dummy%=79   ! großes O
  695.     CASE 129,154  ! Ü und ü
  696.       dummy%=85   ! großes U
  697.     ENDSELECT
  698.     EXIT IF dummy%<=ASC(LEFT$(nn$,1))
  699.   NEXT anfang%
  700.   '
  701.   ' ab hier endgültige Position suchen; alles obige dient _nur_ der Beschleunigung
  702.   FOR i%=anfang% TO max_adr%
  703.     nnvergleich$=@datensatz_umwandeln$(dbnachname$(i%))
  704.     EXIT IF nnvergleich$>nn$ OR nnvergleich$="" ! neues Element ist kleiner==>einfügen
  705.     EXIT IF nnvergleich$=nn$ AND @datensatz_umwandeln$(dbvorname$(i%))>=vn$
  706.   NEXT i%
  707.   RETURN i%
  708. ENDFUNC
  709. ' *************************************************************
  710. > FUNCTION datensatz_umwandeln$(a$)
  711.   a$=TRIM$(UPPER$(a$))
  712.   WHILE INSTR(a$,"Ä")>0
  713.     pos%=INSTR(a$,"Ä")
  714.     a$=LEFT$(a$,pos%-1)+"AE"+MID$(a$,pos%+1)
  715.   WEND
  716.   WHILE INSTR(a$,"Ö")>0
  717.     pos%=INSTR(a$,"Ö")
  718.     a$=LEFT$(a$,pos%-1)+"OE"+MID$(a$,pos%+1)
  719.   WEND
  720.   WHILE INSTR(a$,"Ü")>0
  721.     pos%=INSTR(a$,"Ü")
  722.     a$=LEFT$(a$,pos%-1)+"UE"+MID$(a$,pos%+1)
  723.   WEND
  724.   WHILE INSTR(a$,"ß")>0
  725.     pos%=INSTR(a$,"ß")
  726.     a$=LEFT$(a$,pos%-1)+"SS"+MID$(a$,pos%+1)
  727.   WEND
  728.   RETURN a$
  729. ENDFUNC
  730. ' *********************************************************+
  731. > PROCEDURE datenbank_laden(standard%)
  732.   LOCAL i%
  733.   IF standard%=TRUE
  734.     db_name$=boot_pfad$+"\PRT\ADRESSEN\GELD_HER.ADR"
  735.   ELSE
  736.     pfad$=boot_pfad$+"\PRT\ADRESSEN\*.ADR"
  737.     db_name$=@fileselect$("Datenbank laden",pfad$,"MANDANT.ADR")
  738.   ENDIF
  739.   IF EXIST(db_name$)=TRUE
  740.     GOSUB mausform(8)  ! DISKETTE
  741.     OPEN "I",#1,db_name$
  742.     INPUT #1,dateiversion# ! für spätere Änderungen
  743.     CLR i%
  744.     DO
  745.       INC i%  ! 1 bis max_adr%
  746.       IF i%>max_adr%
  747.         dummy%=@rsc_alert(1,"Die gewählte Adressdatei|ist zu groß !|Bitte max. Datensätze in |'Standards-Speichereinteilung'|auf größeren Wert einstellen.","[Abbruch",1)
  748.         EXIT IF 0=0
  749.       ENDIF
  750.       EXIT IF EOF(#1)=TRUE  ! dann letzter Datensatz
  751.       IF dateiversion#>4.22
  752.         INPUT #1,dbart%(i%)
  753.       ELSE
  754.         dbart%(i%)=1  ! bei alten Adressdateien auf Mandanten-DB setzen
  755.       ENDIF
  756.       INPUT #1,dbvorname$(i%),dbnachname$(i%),dbstrasse$(i%),dbplzort$(i%),dbgf$(i%),dbtel$(i%),dbfax$(i%),dbkuerzel$(i%)
  757.     LOOP
  758.     CLOSE #1
  759.     GOSUB mausform(0)
  760.   ELSE
  761.     dummy%=@rsc_alert(1,"Die gewählte Adress-|datei existiert nicht !","[Abbruch",1)
  762.   ENDIF
  763. RETURN
  764. ' ************************************************************
  765. > PROCEDURE datenbank_dazuladen
  766.   ' Alten Pfad retten
  767.   LOCAL a%,i%,a$,b$,c$,d$,e$,f$,g$,h$
  768.   alt_pfad$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)
  769.   dateiname$=@fileselect$("Datenbank zuladen",boot_pfad$+"\PRT\ADRESSEN\*.ADR","LADEN.ADR")
  770.   IF EXIST(dateiname$)=TRUE
  771.     GOSUB mausform(8)  ! DISKETTE
  772.     OPEN "I",#1,dateiname$
  773.     INPUT #1,dateiversion# ! für spätere Änderungen
  774.     DO
  775.       EXIT IF EOF(#1)=TRUE  ! dann letzter Datensatz
  776.       ' Abbruchbedingung FELD_VOLL
  777.       IF dbart%(max_adr%)>0  ! Dann letzter Datensatz gefüllt
  778.         dummy%=@rsc_alert(1,"Die gewählte Adressdatei|ist zu groß !|Bitte max. Datensätze in |'Standards-Speichereinteilung'|auf größeren Wert einstellen.","[Abbruch",1)
  779.         EXIT IF 0=0
  780.       ENDIF
  781.       IF dateiversion#>4.22
  782.         INPUT #1,a%  ! Dbart
  783.         a%=MAX(a%,1)
  784.       ELSE
  785.         a%=1  ! bei alten Adressdateien auf Mandanten-DB setzen
  786.       ENDIF
  787.       ' INPUT #1,dbvorname$(i%),dbnachname$(i%),dbstrasse$(i%),dbplzort$(i%),dbgf$(i%),dbtel$(i%),dbfax$(i%),dbkuerzel$(i%)
  788.       INPUT #1,a$,b$,c$,d$,e$,f$,g$,h$
  789.       i%=@datensatzposition(b$,a$)
  790.       INSERT dbart%(i%)=a%
  791.       INSERT dbvorname$(i%)=TRIM$(a$)
  792.       INSERT dbnachname$(i%)=TRIM$(b$)
  793.       INSERT dbstrasse$(i%)=TRIM$(c$)
  794.       INSERT dbplzort$(i%)=TRIM$(d$)
  795.       INSERT dbgf$(i%)=TRIM$(e$)
  796.       INSERT dbtel$(i%)=TRIM$(f$)
  797.       INSERT dbfax$(i%)=TRIM$(g$)
  798.       INSERT dbkuerzel$(i%)=TRIM$(h$)
  799.     LOOP
  800.     CLOSE #1
  801.     GOSUB mausform(0)
  802.     db_aenderung%=TRUE
  803.   ELSE
  804.     a$="Gewählte Datei|"+dateiname$+"|existiert nicht !|Bitte erzeugen und nochmal|probieren."
  805.     ~@rsc_alert(1,a$," [OK ",1)
  806.   ENDIF
  807.   CHDIR alt_pfad$
  808. RETURN
  809. ' *********************************************************+
  810. > PROCEDURE datenbank_sichern
  811.   LOCAL i%
  812.   db_name$=boot_pfad$+"\PRT\ADRESSEN\GELD_HER.ADR"
  813.   GOSUB mausform(8)  ! DISKETTE
  814.   IF EXIST(db_name$)=TRUE
  815.     punktpos%=RINSTR(db_name$,".")
  816.     backupname$=LEFT$(db_name$,punktpos%)+"BAK"
  817.     IF EXIST(backupname$)
  818.       KILL backupname$  ! Altes Backup löschen
  819.     ENDIF
  820.     RENAME db_name$ AS backupname$  ! Umbenennen der alten Datendatei als BAK
  821.   ENDIF
  822.   OPEN "O",#1,db_name$
  823.   WRITE #1,version# ! für spätere Änderungen
  824.   FOR i%=1 TO max_adr%
  825.     EXIT IF dbnachname$(i%)=""  ! dann letzter Datensatz
  826.     WRITE #1,dbart%(i%),dbvorname$(i%),dbnachname$(i%),dbstrasse$(i%),dbplzort$(i%),dbgf$(i%),dbtel$(i%),dbfax$(i%),dbkuerzel$(i%)
  827.   NEXT i%
  828.   CLOSE #1
  829.   GOSUB mausform(0)
  830. RETURN
  831. ' ***********************************************************
  832. ' ------------------------------------------------------------
  833. ' Datenbankprozeduren zur Kommunikation mit anderen Dialogboxen
  834. ' --------------------------------------------------------------
  835. ' ************************************************
  836. > PROCEDURE daten_zum_fall(kurz$,such$,tree&,obj&,art%)
  837.   satz%=@kuerzel_suchen(kurz$)
  838.   IF kurz$<>"" AND satz%>0  ! also Kürzel existiert
  839.     @daten_einsetzen(tree&,obj&,satz%)
  840.   ELSE
  841.     @datenbank(such$,tree&,obj&,art%)
  842.   ENDIF
  843. RETURN
  844. ' ****************************************************
  845. > PROCEDURE daten_einsetzen(tree&,obj&,satz%)  ! in die Dialogboxen
  846.   SELECT tree&
  847.   CASE falldatenbaum&
  848.     a$=LEFT$(TRIM$(dbvorname$(satz%)+" "+dbnachname$(satz%)),59)
  849.     IF obj&=glname&
  850.       CHAR{{OB_SPEC(falldatenbaum_adr%,glname&)}}=a$
  851.       CHAR{{OB_SPEC(falldatenbaum_adr%,glstr&)}}=dbstrasse$(satz%)
  852.       CHAR{{OB_SPEC(falldatenbaum_adr%,glort&)}}=dbplzort$(satz%)
  853.       CHAR{{OB_SPEC(falldatenbaum_adr%,glgf&)}}=dbgf$(satz%)
  854.     ELSE IF obj&=schname&
  855.       CHAR{{OB_SPEC(falldatenbaum_adr%,schname&)}}=a$
  856.       CHAR{{OB_SPEC(falldatenbaum_adr%,schstr&)}}=dbstrasse$(satz%)
  857.       CHAR{{OB_SPEC(falldatenbaum_adr%,schort&)}}=dbplzort$(satz%)
  858.       CHAR{{OB_SPEC(falldatenbaum_adr%,schgf&)}}=dbgf$(satz%)
  859.     ENDIF
  860.   CASE adressbaum&
  861.     a$=TRIM$(dbvorname$(satz%)+" "+dbnachname$(satz%))
  862.     IF LEN(a$)>45
  863.       lzpos%=RINSTR(a$," ",46)
  864.       b$=TRIM$(MID$(a$,lzpos%+1))
  865.       a$=TRIM$(LEFT$(a$,lzpos%))
  866.     ELSE
  867.       b$=""
  868.     ENDIF
  869.     CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}=LEFT$(a$,45)
  870.     CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=b$
  871.     CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}=LEFT$(dbstrasse$(satz%),45)
  872.     CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=LEFT$(dbplzort$(satz%),45)
  873.     CHAR{{OB_SPEC(adressbaum_adr%,gf1&)}}=LEFT$(dbgf$(satz%),45)
  874.   CASE mbbaum1&  ! einzelne Feldlängen sind 65 Zeichen
  875.     IF obj&=as1&
  876.       dummy$=TRIM$(dbvorname$(satz%)+" "+dbnachname$(satz%))
  877.       IF dbgf$(satz%)<>""
  878.         dummy$=dummy$+", vertreten durch "+dbgf$(satz%)
  879.       ENDIF
  880.       dummy$=dummy$+", "+dbstrasse$(satz%)+", "+dbplzort$(satz%)
  881.       ' Jetzt den Gesamtstring in max 3 Zeilen je 65 Zeichen teilen
  882.       DIM dummy$(3)
  883.       FOR i%=1 TO 3
  884.         IF LEN(dummy$)>65
  885.           lzpos%=RINSTR(dummy$," ",65)
  886.           dummy$(i%)=TRIM$(LEFT$(dummy$,lzpos%))  ! Inhalt der ersten Zeile
  887.           dummy$=TRIM$(MID$(dummy$,lzpos%+1)) ! =Reststring
  888.         ELSE
  889.           dummy$(i%)=dummy$
  890.           dummy$=""
  891.         ENDIF
  892.       NEXT i%
  893.       '
  894.       CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}}=dummy$(1)
  895.       CHAR{{OB_SPEC(mbbaum1_adr%,as2&)}}=dummy$(2)
  896.       CHAR{{OB_SPEC(mbbaum1_adr%,as3&)}}=dummy$(3)
  897.       '    CHAR{{OB_SPEC(mbbaum1_adr%,as4&)}}="" ! hier steht der Prozeßbevollmächtigte
  898.       '    CHAR{{OB_SPEC(mbbaum1_adr%,as5&)}}="" ! zumindest in der Regel
  899.       ERASE dummy$()
  900.     ELSE IF obj&=ag1&
  901.       DIM dummy$(8)
  902.       dummy$(1)=TRIM$(dbvorname$(satz%)+" "+dbnachname$(satz%))
  903.       IF dbgf$(satz%)<>""
  904.         dummy$(4)="vertr.d. "+dbgf$(satz%)
  905.       ENDIF
  906.       dummy$(6)=dbstrasse$(satz%)
  907.       dummy$(8)=dbplzort$(satz%)
  908.       ' Jetzt den Gesamtstring in max 8 Zeilen je 34 Zeichen teilen
  909.       FOR i%=1 TO 7  ! zu lange Strings auf 2 Zeilen verteilen
  910.         IF LEN(dummy$(i%))>34
  911.           lzpos%=RINSTR(dummy$(i%)," ",34)
  912.           dummy$(i%+1)=TRIM$(MID$(dummy$(i%),lzpos%+1)) ! =Reststring
  913.           dummy$(i%)=TRIM$(LEFT$(dummy$(i%),lzpos%))  ! Inhalt der ersten Zeile
  914.         ENDIF
  915.       NEXT i%
  916.       '
  917.       FOR i%=1 TO 8
  918.         CHAR{{OB_SPEC(mbbaum1_adr%,ag1&-1+i%)}}=TRIM$(LEFT$(dummy$(i%),34))
  919.       NEXT i%
  920.       ERASE dummy$()
  921.     ENDIF
  922.   CASE mbbaum2&
  923.     dummy$=LEFT$(TRIM$(dbvorname$(satz%)+" "+dbnachname$(satz%)),59)
  924.     dummy$=dummy$+", "+dbstrasse$(satz%)+", "+dbplzort$(satz%)
  925.     CHAR{{OB_SPEC(mbbaum2_adr%,streitgericht&)}}=TRIM$(LEFT$(dummy$,65))
  926.   ENDSELECT
  927. RETURN
  928. ' *********************************************************+
  929. '
  930. '
  931. '
  932. ' =============================================================
  933. ' MAHNBESCHEIDSPROGRAMME
  934. ' ============================================================
  935. ' Normaler Mahnbescheid
  936. ' ----------------------
  937. ' *************************************************
  938. > PROCEDURE mahnbescheid(flag%)
  939.   ' flag%=1 bei normalem MB, der gedruckt werden soll
  940.   ' flag%=2 bei zu speicherndem Muster-MB
  941.   ' flag%=3 bei anlegen des Standard-MB
  942.   mbauswahlbaum_adr%=rsc_adr%(mbauswahlbaum&)
  943.   @dialog_positionieren(mbauswahlbaum&)
  944.   IF flag%=1 ! MB erstellen + dann drucken
  945.     @select(mbauswahlbaum_adr%,mbambplus367&,TRUE)  ! Voreinstellung: zugleich Datei anlegen
  946.     @select(mbauswahlbaum_adr%,mbadazubuchen&,FALSE)  ! andere deselektieren
  947.     @select(mbauswahlbaum_adr%,mbanichtbuchen&,FALSE)  ! andere deselektieren
  948.   ELSE ! MB-Muster sichern oder Standard-MB anlegen
  949.     FOR i&=mbambplus367&-1 TO mbanichtbuchen&
  950.       @do_objc(mbauswahlbaum_adr%,i&,&H8) ! helle Darstellung
  951.     NEXT i&
  952.   ENDIF
  953.   '
  954.   @rsc_draw(mbauswahlbaum&,fensterdial%)
  955.   erstes_objekt%=0
  956.   ex_obj%=@rsc_do(mbauswahlbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  957.   @rsc_back(mbauswahlbaum&)
  958.   @select(mbauswahlbaum_adr%,ex_obj%,FALSE)
  959.   '
  960.   ' Rücksetzen der deselektierten Objekte
  961.   FOR i&=mbambplus367&-1 TO mbanichtbuchen&
  962.     @undo_objc(mbauswahlbaum_adr%,i&,&H8) ! Schwarze Darstellung
  963.   NEXT i&
  964.   '
  965.   ' Auswertung
  966.   IF ex_obj%=mbaok&
  967.     IF @selected(mbauswahlbaum_adr%,mbastandard&)=TRUE
  968.       @mb_muster_laden(FALSE)  ! FALSE Datei STANDARD.MB laden
  969.       ' Voreinstellung der HF-Datums = aktuelles Datum
  970.       CHAR{{OB_SPEC(rsc_adr%(mbbaum2&),mbhfdatum&)}}=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  971.     ELSE IF @selected(mbauswahlbaum_adr%,mbaladen&)=TRUE
  972.       @mb_muster_laden(TRUE)  ! TRUE: mit Fileselectbox
  973.       ' Voreinstellung der HF-Datums = aktuelles Datum
  974.       CHAR{{OB_SPEC(rsc_adr%(mbbaum2&),mbhfdatum&)}}=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  975.     ELSE IF @selected(mbauswahlbaum_adr%,mbaaktaufst&)=TRUE
  976.       @mb_daten_einsetzen  ! (aus der Forderungsberechnung)
  977.       mb_mitmwst%=mitmwst%
  978.       ' Voreinstellung der HF-Datums = aktuelles Datum
  979.       CHAR{{OB_SPEC(rsc_adr%(mbbaum2&),mbhfdatum&)}}=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  980.     ELSE IF @selected(mbauswahlbaum_adr%,mbanichtaendern&)=TRUE
  981.       ' nichts machen damit z.B. nochmal gedruckt werden kann
  982.     ENDIF
  983.   ELSE
  984.     abbruch%=TRUE
  985.     GOTO mb_ende
  986.   ENDIF
  987.   '
  988.   IF @selected(mbauswahlbaum_adr%,mbambplus367&)=TRUE AND flag%=1 ! neue 367-Datei anlegen
  989.     IF aufstellungsaenderung#=TRUE  ! Andernfalls ist sie eh schon gesichert
  990.       IF @rsc_alert(1,"Aktuelle Forderungsberechnung|wird gelöscht. Bitte|vorher speichern.","[Speichern|[Weiter",1)=1
  991.         GOSUB diskspeichern
  992.       ENDIF
  993.     ENDIF
  994.     ' Aktenzeichen und Falldaten erfragen
  995.     GOSUB az(az$)
  996.     IF abbruch%=TRUE
  997.       GOTO mb_ende  ! durchschleifen
  998.     ENDIF
  999.     GOSUB falleingaben
  1000.     IF abbruch%=TRUE
  1001.       GOTO mb_ende  ! durchschleifen
  1002.     ENDIF
  1003.   ENDIF
  1004. mb_neu:
  1005.   GOSUB mb_formular1
  1006.   IF abbruch%=TRUE
  1007.     GOTO mb_ende  ! durchschleifen
  1008.   ENDIF
  1009.   GOSUB mb_formular2(ex_obj%)
  1010.   IF ex_obj%=mb2zurueck&
  1011.     GOTO mb_neu
  1012.   ELSE IF abbruch%=TRUE
  1013.     GOTO mb_ende  ! durchschleifen
  1014.   ENDIF
  1015.   IF flag%=1  ! MB drucken
  1016.     @mb_daten_auslesen
  1017.     @mb_druck
  1018.     ' je nach Anwahl bei MB-Voreinstellungen 367-Datei anlegen, ergänzen, oder lassen
  1019.     IF @selected(mbauswahlbaum_adr%,mbambplus367&)=TRUE AND abbruch%=FALSE ! 367-Datei neu anlegen
  1020.       dateiname$=""  ! Für Voreinstellungen bei diskladen bzw speichern
  1021.       ' Felder löschen
  1022.       ARRAYFILL fdgdatum%(),0
  1023.       ARRAYFILL zinsdatum%(),0
  1024.       ARRAYFILL betrag#(),0
  1025.       ARRAYFILL restbetrag#(),0
  1026.       ARRAYFILL zinssatz#(),0
  1027.       ARRAYFILL fdgart#(),0
  1028.       FOR i%=0 TO maximalbuchungen%
  1029.         fdgtxt$(i%)=""
  1030.         fdgname$(i%)=""
  1031.       NEXT i%
  1032.       ' FELDER SIND LEER
  1033.       @mb_dazubuchen
  1034.     ELSE IF @selected(mbauswahlbaum_adr%,mbanichtbuchen&)=TRUE
  1035.       ' nichts machen
  1036.     ELSE IF @selected(mbauswahlbaum_adr%,mbadazubuchen&)=TRUE AND abbruch%=FALSE ! 367-Datei erweitern
  1037.       @mb_dazubuchen
  1038.     ENDIF
  1039.     GOSUB neuberechnung(1)
  1040.     GOSUB forderungstextfeld
  1041.   ENDIF  ! ab hier also auch für Muster-MBs usw.
  1042.   @redraw_part(0,0)
  1043.   '
  1044. mb_ende:
  1045. RETURN
  1046. ' **********************************************
  1047. > PROCEDURE mb_formular1
  1048.   ' Erstes MB-Formular
  1049.   mbbaum1_adr%=rsc_adr%(mbbaum1&)
  1050.   @dialog_positionieren(mbbaum1&)
  1051.   '
  1052.   ' Vorbereitung des Dialogs
  1053.   @rsc_draw(mbbaum1&,fensterdial%)
  1054.   erstes_objekt%=mahngericht&
  1055.   DO
  1056.     ex_obj%=@rsc_do(mbbaum1&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  1057.     SELECT ex_obj%
  1058.     CASE mbuebernahmeas&
  1059.       ' Voreinstellung Antragsteller mit Wordwrap
  1060.       a$=glaeubigeranrede1$+", "+glaeubigerstrasse$+", "+glaeubigerort$+" "
  1061.       lzpos%=RINSTR(a$," ",65)
  1062.       CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}}=LEFT$(a$,lzpos%-1)
  1063.       CHAR{{OB_SPEC(mbbaum1_adr%,as2&)}}=TRIM$(MID$(a$,lzpos%+1,65))
  1064.       IF glaeubigergf1$<>""
  1065.         CHAR{{OB_SPEC(mbbaum1_adr%,as3&)}}=LEFT$("vertr. durch "+glaeubigergf1$,65)
  1066.       ELSE
  1067.         CHAR{{OB_SPEC(mbbaum1_adr%,as3&)}}=""
  1068.       ENDIF
  1069.       ' Prozeßbevollmächtigten nur in letzte beiden Zeilen, wenn leer
  1070.       IF CHAR{{OB_SPEC(mbbaum1_adr%,as4&)}}="" AND CHAR{{OB_SPEC(mbbaum1_adr%,as5&)}}=""
  1071.         a$="Prozeßbev.: "+useranrede1$+" "+useranrede2$+", "+userstr$+", "+userort$+", "+userbank$+" Konto "+userkto$+" BLZ "+userblz$+" "
  1072.         lzpos%=RINSTR(a$," ",65)
  1073.         CHAR{{OB_SPEC(mbbaum1_adr%,as4&)}}=LEFT$(a$,lzpos%-1)
  1074.         CHAR{{OB_SPEC(mbbaum1_adr%,as5&)}}=TRIM$(MID$(a$,lzpos%+1,65))
  1075.       ENDIF
  1076.       FOR i%=as1& TO as5&
  1077.         @objc_update(mbbaum1_adr%,i%)
  1078.       NEXT i%
  1079.     CASE mbasdb&
  1080.       ' Prüfen, ob kürzel angegeben ist ($.....), ggf extrahieren + DB aufrufen
  1081.       suchstring$=CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}}
  1082.       IF INSTR(suchstring$,"$")>0  ! dann kürzel angegeben
  1083.         kuerzel$=MID$(suchstring$,INSTR(suchstring$,"$")+1)
  1084.         suchstring$=""
  1085.       ELSE
  1086.         kuerzel$=""
  1087.       ENDIF
  1088.       ' Parameter: Kürzel,suchstring,aufrufender Baum,Objekt,Adressenart
  1089.       @daten_zum_fall(kuerzel$,suchstring$,mbbaum1&,as1&,1)
  1090.       FOR i%=as1& TO as5&
  1091.         @objc_update(mbbaum1_adr%,i%)
  1092.       NEXT i%
  1093.       erstes_objekt%=as1&
  1094.     CASE mbuebernahmeag&
  1095.       CHAR{{OB_SPEC(mbbaum1_adr%,ag1&)}}=""
  1096.       CHAR{{OB_SPEC(mbbaum1_adr%,ag2&)}}=LEFT$(schuldneranrede1$,34)
  1097.       IF schuldnergf1$<>""
  1098.         CHAR{{OB_SPEC(mbbaum1_adr%,ag3&)}}="vertreten durch"
  1099.         CHAR{{OB_SPEC(mbbaum1_adr%,ag4&)}}=LEFT$(schuldnergf1$,34)
  1100.       ELSE
  1101.         CHAR{{OB_SPEC(mbbaum1_adr%,ag3&)}}=""
  1102.         CHAR{{OB_SPEC(mbbaum1_adr%,ag4&)}}=""
  1103.       ENDIF
  1104.       CHAR{{OB_SPEC(mbbaum1_adr%,ag5&)}}=""
  1105.       CHAR{{OB_SPEC(mbbaum1_adr%,ag6&)}}=LEFT$(schuldnerstrasse$,34)
  1106.       CHAR{{OB_SPEC(mbbaum1_adr%,ag7&)}}=""
  1107.       CHAR{{OB_SPEC(mbbaum1_adr%,ag8&)}}=LEFT$(schuldnerort$,34)
  1108.       FOR i%=ag1& TO ag8&
  1109.         @objc_update(mbbaum1_adr%,i%)
  1110.       NEXT i%
  1111.     CASE mbagdb&
  1112.       ' Prüfen, ob kürzel angegeben ist ($.....), ggf extrahieren + DB aufrufen
  1113.       suchstring$=CHAR{{OB_SPEC(mbbaum1_adr%,ag1&)}}
  1114.       IF INSTR(suchstring$,"$")>0  ! dann kürzel angegeben
  1115.         kuerzel$=MID$(suchstring$,INSTR(suchstring$,"$")+1)
  1116.         suchstring$=""
  1117.       ELSE
  1118.         kuerzel$=""
  1119.       ENDIF
  1120.       ' Parameter: Kürzel,suchstring,aufrufender Baum,Objekt,Adressenart
  1121.       @daten_zum_fall(kuerzel$,suchstring$,mbbaum1&,ag1&,1)
  1122.       FOR i%=ag1& TO ag8&
  1123.         @objc_update(mbbaum1_adr%,i%)
  1124.       NEXT i%
  1125.       erstes_objekt%=ag1&
  1126.     CASE mb1ok&
  1127.       IF VAL(TRIM$(CHAR{{OB_SPEC(mbbaum1_adr%,aszahl&)}}))<1
  1128.         ~@rsc_alert(1,"Zahl der Antragssteller|ist unsinnig"," [OK ",1)
  1129.         @select(mbbaum1_adr%,ex_obj%,FALSE)
  1130.         @objc_update(mbbaum1_adr%,ex_obj%)
  1131.         ex_obj%=FALSE  ! wegen LOOP-Bedingung
  1132.       ENDIF
  1133.       IF VAL(TRIM$(CHAR{{OB_SPEC(mbbaum1_adr%,agzahl&)}}))<1
  1134.         ~@rsc_alert(1,"Zahl der Antragsgegner|ist unsinnig"," [OK ",1)
  1135.         @select(mbbaum1_adr%,ex_obj%,FALSE)
  1136.         @objc_update(mbbaum1_adr%,ex_obj%)
  1137.         ex_obj%=FALSE  ! wegen LOOP-Bedingung
  1138.       ENDIF
  1139.     CASE mb1abbruch&
  1140.       abbruch%=TRUE
  1141.     ENDSELECT
  1142.   LOOP UNTIL ex_obj%=mb1ok& OR ex_obj%=mb1abbruch&
  1143.   @rsc_back(mbbaum1&)
  1144.   @select(mbbaum1_adr%,ex_obj%,FALSE)
  1145.   ' Dialog beendet
  1146.   ' Daten auslesen, soweit sie schon im 2. Dialog benötigt werden
  1147.   mb_agzahl%=VAL(TRIM$(CHAR{{OB_SPEC(mbbaum1_adr%,agzahl&)}}))
  1148.   mb_aszahl%=VAL(TRIM$(CHAR{{OB_SPEC(mbbaum1_adr%,aszahl&)}}))
  1149. RETURN
  1150. ' ********************************************************************
  1151. > PROCEDURE mb_formular2(VAR dummy%)
  1152.   LOCAL ex_obj%
  1153.   ' Zweites MB-Formular
  1154.   mbbaum2_adr%=rsc_adr%(mbbaum2&)
  1155.   @dialog_positionieren(mbbaum2&)
  1156.   ' Voreinstellungen setzen
  1157.   IF ostwestfaktor#=1
  1158.     CHAR{{OB_SPEC(mbbaum2_adr%,westost&)}}="West"
  1159.   ELSE IF ostwestfaktor#=0.8
  1160.     CHAR{{OB_SPEC(mbbaum2_adr%,westost&)}}="Ost "
  1161.   ELSE IF ostwestfaktor#=0
  1162.     CHAR{{OB_SPEC(mbbaum2_adr%,westost&)}}="ohne"
  1163.   ENDIF
  1164.   '
  1165.   ' Vorbereitung des Dialogs
  1166.   @rsc_draw(mbbaum2&,fensterdial%)
  1167.   @mb_berechnen  ! damit kein Schmonz eingesetzt werden kann
  1168.   erstes_objekt%=mbhfdatum&
  1169.   DO
  1170.     ex_obj%=@rsc_do(mbbaum2&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  1171.     SELECT ex_obj%
  1172.     CASE mbhf&,hauptforderung&  ! incl. Gebühren neu berechnen
  1173.       GOSUB zahleneingaben(mbbaum2_adr%,hauptforderung&,12)
  1174.       ' Baumadresse,Editobjekt,Maximallänge)
  1175.       IF VAL(TRIM$(CHAR{{OB_SPEC(mbbaum2_adr%,hauptforderung&)}}))>100000 AND demoversion%=TRUE
  1176.         dummy%=@rsc_alert(1,"Geld_her! 3.0 Demoversion|MBs nur bis DM 1000.-|Kein Ausdruck möglich."," [OK ",1)
  1177.         abbruch%=TRUE
  1178.         druckabbruch%=TRUE
  1179.       ENDIF
  1180.       GOSUB mb_berechnen
  1181.     CASE mbnf&,nebenforderung&  ! für Gebühren unerheblich, d.h. nur senkrecht berechnen
  1182.       GOSUB zahleneingaben(mbbaum2_adr%,nebenforderung&,12)
  1183.       ' Baumadresse,Editobjekt,Maximallänge)
  1184.       mb_hf#=VAL(CHAR{{OB_SPEC(mbbaum2_adr%,hauptforderung&)}})/100
  1185.       mb_nf#=VAL(CHAR{{OB_SPEC(mbbaum2_adr%,nebenforderung&)}})/100
  1186.       mb_kosten#=VAL(TRIM$(CHAR{{OB_SPEC(mbbaum2_adr%,mbkosten&)}}))/100
  1187.       mb_summe#=mb_hf#+mb_nf#+mb_kosten#
  1188.       @dm_zahlen_einsetzen(mbbaum2_adr%,mbsumme&,mb_summe#,12)
  1189.       GOSUB objc_update(mbbaum2_adr%,mbsumme&)
  1190.     CASE mbauslagenast&  ! incl. Gebühren neu berechnen
  1191.       GOSUB zahleneingaben(mbbaum2_adr%,mbauslagenast&,7)
  1192.       ' Baumadresse,Editobjekt,Maximallänge)
  1193.       GOSUB mb_berechnen
  1194.     CASE mbmwstpv&
  1195.       IF mb_mitmwst%=0  ! Wechseln
  1196.         mb_mitmwst%=1
  1197.       ELSE
  1198.         mb_mitmwst%=0
  1199.       ENDIF
  1200.       @mb_berechnen
  1201.     CASE mbvorsteuer&  ! incl. Gebühren neu berechnen
  1202.       IF @selected(mbbaum2_adr%,mbvorsteuer&)=TRUE
  1203.         mb_as1$=CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}}
  1204.         IF mwst_trotz_vorsteuerabzug%=FALSE OR INSTR(CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}},eigensache$)>0
  1205.           ' also auch bei eigenen Sachen nie MwSt
  1206.           mb_mitmwst%=0
  1207.         ENDIF
  1208.       ELSE
  1209.         mb_mitmwst%=1
  1210.       ENDIF
  1211.       GOSUB mb_berechnen
  1212.     CASE mbzinszustellg&
  1213.       IF @selected(mbbaum2_adr%,mbzinszustellg&)=TRUE
  1214.         GOSUB do_objc(mbbaum2_adr%,mbzinsdat&,&H8) ! helle Darstellung
  1215.         GOSUB del_flag(mbbaum2_adr%,mbzinsdat&,8) ! nicht editable
  1216.       ELSE
  1217.         GOSUB undo_objc(mbbaum2_adr%,mbzinsdat&,&H8) ! normale Darstellung
  1218.         GOSUB set_flag(mbbaum2_adr%,mbzinsdat&,8) ! editable
  1219.       ENDIF
  1220.       @objc_update(mbbaum2_adr%,mbzinsdat&)
  1221.     CASE mbstreitgdb&
  1222.       ' Prüfen, ob kürzel angegeben ist ($.....), ggf extrahieren + DB aufrufen
  1223.       suchstring$=CHAR{{OB_SPEC(mbbaum2_adr%,streitgericht&)}}
  1224.       IF INSTR(suchstring$,"$")>0  ! dann kürzel angegeben
  1225.         kuerzel$=MID$(suchstring$,INSTR(suchstring$,"$")+1)
  1226.         suchstring$=""
  1227.       ELSE
  1228.         kuerzel$=""
  1229.       ENDIF
  1230.       ' Parameter: Kürzel,suchstring,aufrufender Baum,Objekt,Adressenart
  1231.       @daten_zum_fall(kuerzel$,suchstring$,mbbaum2&,streitgericht&,2)
  1232.       @objc_update(mbbaum2_adr%,streitgericht&)
  1233.       erstes_objekt%=streitgericht&
  1234.     CASE mb2abbruch&
  1235.       abbruch%=TRUE
  1236.     ENDSELECT
  1237.   LOOP UNTIL ex_obj%=mb2ok& OR ex_obj%=mb2abbruch& OR ex_obj%=mb2zurueck&
  1238.   rsc_back(mbbaum2&)
  1239.   @select(mbbaum2_adr%,ex_obj%,FALSE)
  1240.   dummy%=ex_obj%
  1241. RETURN
  1242. ' ************************************************+
  1243. > PROCEDURE mb_daten_auslesen
  1244.   mb_mahngericht$=CHAR{{OB_SPEC(mbbaum1_adr%,mahngericht&)}}
  1245.   mb_agzahl$=CHAR{{OB_SPEC(mbbaum1_adr%,agzahl&)}}
  1246.   mb_aszahl$=CHAR{{OB_SPEC(mbbaum1_adr%,aszahl&)}}
  1247.   mb_ag1$=CHAR{{OB_SPEC(mbbaum1_adr%,ag1&)}}
  1248.   mb_ag2$=CHAR{{OB_SPEC(mbbaum1_adr%,ag2&)}}
  1249.   mb_ag3$=CHAR{{OB_SPEC(mbbaum1_adr%,ag3&)}}
  1250.   mb_ag4$=CHAR{{OB_SPEC(mbbaum1_adr%,ag4&)}}
  1251.   mb_ag5$=CHAR{{OB_SPEC(mbbaum1_adr%,ag5&)}}
  1252.   mb_ag6$=CHAR{{OB_SPEC(mbbaum1_adr%,ag6&)}}
  1253.   mb_ag7$=CHAR{{OB_SPEC(mbbaum1_adr%,ag7&)}}
  1254.   mb_ag8$=CHAR{{OB_SPEC(mbbaum1_adr%,ag8&)}}
  1255.   a$=LEFT$(TRIM$(CHAR{{OB_SPEC(mbbaum1_adr%,mbartpopup&)}}),1)
  1256.   IF a$="N"  ! Normaler MB
  1257.     mb_art$=""
  1258.   ELSE IF a$="U"  !Urkunden-MB
  1259.     mb_art$="Urkunden"
  1260.   ELSE IF a$="W"  !Wechsel-MB
  1261.     mb_art$="Wechsel"
  1262.   ELSE IF a$="S"  !Scheck-MB
  1263.     mb_art$="Scheck"
  1264.   ENDIF
  1265.   mb_as1$=CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}}
  1266.   mb_as2$=CHAR{{OB_SPEC(mbbaum1_adr%,as2&)}}
  1267.   mb_as3$=CHAR{{OB_SPEC(mbbaum1_adr%,as3&)}}
  1268.   mb_as4$=CHAR{{OB_SPEC(mbbaum1_adr%,as4&)}}
  1269.   mb_as5$=CHAR{{OB_SPEC(mbbaum1_adr%,as5&)}}
  1270.   mb_gesamtschuldner1$=SPACE$(49)  ! Länge muß bleiben, da rechts noch was steht
  1271.   LSET mb_gesamtschuldner1$=CHAR{{OB_SPEC(mbbaum1_adr%,gesschuldner1&)}}
  1272.   mb_gesamtschuldner2$=SPACE$(59)
  1273.   LSET mb_gesamtschuldner2$=CHAR{{OB_SPEC(mbbaum1_adr%,gesschuldner2&)}}
  1274.   IF @selected(mbbaum1_adr%,gesschuld&)=TRUE
  1275.     mb_gesamtschuldnerschaft$="X"
  1276.   ELSE
  1277.     mb_gesamtschuldnerschaft$=""
  1278.   ENDIF
  1279.   mb_az$=CHAR{{OB_SPEC(mbbaum2_adr%,mbaz&)}}
  1280.   mb_anspruch1$=CHAR{{OB_SPEC(mbbaum2_adr%,anspruch1&)}}
  1281.   mb_anspruch2$=CHAR{{OB_SPEC(mbbaum2_adr%,anspruch2&)}}
  1282.   mb_anspruch3$=CHAR{{OB_SPEC(mbbaum2_adr%,anspruch3&)}}
  1283.   mb_anspruch4$=CHAR{{OB_SPEC(mbbaum2_adr%,anspruch4&)}}
  1284.   mb_anspruch5$=CHAR{{OB_SPEC(mbbaum2_adr%,anspruch5&)}}
  1285.   mb_zins$=CHAR{{OB_SPEC(mbbaum2_adr%,mbzins&)}}
  1286.   @zahlenumwandlung(2,mb_zins$,wert#,dummy#)
  1287.   mb_zins$=STR$(wert#)+" %"
  1288.   IF @selected(mbbaum2_adr%,mbueberdiskont&)=TRUE ! Negativ bei diskzins
  1289.     mb_zins$=mb_zins$+" über Bundesbankdiskont"
  1290.   ENDIF
  1291.   IF @selected(mbbaum2_adr%,mbzinszustellg&)=TRUE  ! Zinsen ab Zustellung
  1292.     mb_zinsdat$="Zustellung des Mahnbescheids"
  1293.   ELSE
  1294.     mb_zinsdat$=CHAR{{OB_SPEC(mbbaum2_adr%,mbzinsdat&)}}
  1295.     mb_zinsdat$=LEFT$(mb_zinsdat$,2)+"."+MID$(mb_zinsdat$,3,2)+"."+MID$(mb_zinsdat$,5)
  1296.   ENDIF
  1297.   mb_zins1$=CHAR{{OB_SPEC(mbbaum2_adr%,zinsen1&)}}
  1298.   mb_zins2$=CHAR{{OB_SPEC(mbbaum2_adr%,zinsen2&)}}
  1299.   mb_hf$=CHAR{{OB_SPEC(mbbaum2_adr%,hauptforderung&)}}
  1300.   mb_nf$=CHAR{{OB_SPEC(mbbaum2_adr%,nebenforderung&)}}
  1301.   mb_kst$=CHAR{{OB_SPEC(mbbaum2_adr%,mbkosten&)}}
  1302.   mb_gk$=CHAR{{OB_SPEC(mbbaum2_adr%,mbgk&)}}
  1303.   mb_ausl$=CHAR{{OB_SPEC(mbbaum2_adr%,mbauslagenast&)}}
  1304.   mb_geb$=CHAR{{OB_SPEC(mbbaum2_adr%,mbgebuehren&)}}
  1305.   mb_pval$=CHAR{{OB_SPEC(mbbaum2_adr%,mbauslagenpv&)}}
  1306.   mb_mwst$=CHAR{{OB_SPEC(mbbaum2_adr%,mbmwstpv&)}}
  1307.   mb_summe$=CHAR{{OB_SPEC(mbbaum2_adr%,mbsumme&)}}
  1308.   mb_abgabegericht$=CHAR{{OB_SPEC(mbbaum2_adr%,streitgericht&)}}
  1309.   mb_ortdatum$=CHAR{{OB_SPEC(mbbaum2_adr%,mbort&)}}
  1310.   mb_pv1$=SPACE$(32)  ! Müssen immer gleich lang sein, da nach ihnen
  1311.   mb_pv2$=SPACE$(32)  ! Noch was in der Zeile steht
  1312.   mb_pv3$=SPACE$(32)
  1313.   mb_pv4$=SPACE$(32)
  1314.   mb_pv5$=SPACE$(32)
  1315.   mb_pv6$=SPACE$(32)
  1316.   mb_pv7$=SPACE$(32)
  1317.   mb_pv8$=SPACE$(32)
  1318.   LSET mb_pv1$=CHAR{{OB_SPEC(mbbaum2_adr%,pv1&)}}
  1319.   LSET mb_pv2$=CHAR{{OB_SPEC(mbbaum2_adr%,pv2&)}}
  1320.   LSET mb_pv3$=CHAR{{OB_SPEC(mbbaum2_adr%,pv3&)}}
  1321.   LSET mb_pv4$=CHAR{{OB_SPEC(mbbaum2_adr%,pv4&)}}
  1322.   LSET mb_pv5$=CHAR{{OB_SPEC(mbbaum2_adr%,pv5&)}}
  1323.   LSET mb_pv6$=CHAR{{OB_SPEC(mbbaum2_adr%,pv6&)}}
  1324.   LSET mb_pv7$=CHAR{{OB_SPEC(mbbaum2_adr%,pv7&)}}
  1325.   LSET mb_pv8$=CHAR{{OB_SPEC(mbbaum2_adr%,pv8&)}}
  1326.   IF @selected(mbbaum2_adr%,ohneggleistg&)=TRUE
  1327.     mb_ggl1$="X"
  1328.     mb_ggl2$=" "
  1329.   ELSE
  1330.     mb_ggl1$=" "
  1331.     mb_ggl2$="X"
  1332.   ENDIF
  1333.   IF @selected(mbbaum2_adr%,mbstreitverf&)=TRUE
  1334.     mb_streitverfahren$="X"
  1335.   ELSE
  1336.     mb_streitverfahren$=" "
  1337.   ENDIF
  1338.   IF @selected(mbbaum2_adr%,mbvorsteuer&)=TRUE
  1339.     mb_vorsteuer$=" "  ! Vorsteuerabzug besteht
  1340.   ELSE
  1341.     mb_vorsteuer$="X"  ! Vorsteuerabzug besteht nicht
  1342.   ENDIF
  1343.   IF @selected(mbbaum2_adr%,mbvollmacht&)=TRUE
  1344.     mb_vollmacht$="X"
  1345.   ELSE
  1346.     mb_vollmacht$=" "
  1347.   ENDIF
  1348. RETURN
  1349. ' ****************************************************
  1350. > PROCEDURE mb_druck
  1351.   IF OUT?(0)=FALSE   !GEMDOS(17)=0
  1352.     IF @rsc_alert(1,"Bitte Schalten Sie|Ihren Drucker ein.","[OK|[Abbruch",1)=2
  1353.       abbruch%=TRUE
  1354.       GOTO mb_druckende
  1355.     ENDIF
  1356.   ENDIF
  1357.   wasdrucken%=30  ! hier ist das mb-muster
  1358.   @druckerladen(2)  ! MB-Drucker Laden
  1359.   @ausgabestring_erstellen(TRUE)  ! mit Steuerzeichen
  1360.   '
  1361.   ' DRUCKBEGINN
  1362.   PRINT #0;initialisierung$;
  1363.   ' EINSETZEN DER STEUERZEICHEN FÜR DIE SEITENLÄNGE
  1364.   pos%=INSTR(seitenlaenge$,CHR$(255))  ! CHR 255 wird durch STRING abstand_von_links ersetzt
  1365.   IF pos%>0  ! D.h. Steuercode enthält CHR$(255)
  1366.     PRINT #0;LEFT$(seitenlaenge$,pos%-1);mb_seitenlaenge%;MID$(seitenlaenge$,pos%+1);
  1367.   ENDIF
  1368.   pos%=INSTR(seitenlaenge$,CHR$(254))  ! CHR 254 wird durch CHR$(abstand_von_links) ersetzt
  1369.   IF pos%>0  ! D.h. Steuercode enthält CHR$(254)
  1370.     PRINT #0;LEFT$(seitenlaenge$,pos%-1);CHR$(mb_seitenlaenge%);MID$(linkerrand$,pos%+1);
  1371.   ENDIF
  1372.   '
  1373.   ' EINSETZEN DER STEUERZEICHEN DEN LINKEN RAND
  1374.   IF INSTR(linkerrand$,CHR$(255))>0  ! CHR 255 wird durch abstand_von_links ersetzt
  1375.     pos%=INSTR(linkerrand$,CHR$(255))  ! CHR 255 wird durch abstand_von_links ersetzt
  1376.     PRINT #0;LEFT$(linkerrand$,pos%-1);mb_abstand_von_links%;MID$(linkerrand$,pos%+1);
  1377.   ELSE IF INSTR(linkerrand$,CHR$(254))>0  ! CHR 254 wird durch chr$(abstand_von_links) ersetzt
  1378.     pos%=INSTR(linkerrand$,CHR$(254))  ! CHR 254 wird durch chr$(abstand_von_links) ersetzt
  1379.     PRINT #0;LEFT$(linkerrand$,pos%-1);CHR$(mb_abstand_von_links%);MID$(linkerrand$,pos%+1);
  1380.   ELSE  ! linker Abstand hat feste Steuersequenz
  1381.     PRINT #0;linkerrand$;
  1382.   ENDIF
  1383.   '
  1384.   ' RAND
  1385.   FOR i%=1 TO mb_abstand_von_oben%
  1386.     PRINT #0
  1387.   NEXT i%
  1388.   '  GOSUB zeilendruck(CHR$(253)+CHR$(5)+ausgabe$)  ! Chr$ unterdrückt Umbruch
  1389.   GOSUB ausgabeumwandlung(ausgabe$,ausgabe$)
  1390.   PRINT #0;ausgabe$;
  1391.   PRINT #0;formfeed$;nachspann$; ! Auswurf des letzten Blattes ohne CR/LF
  1392. mb_druckende:
  1393.   @mausform(0)
  1394.   @druckerladen(1)  ! Standarddrucker laden
  1395. RETURN
  1396. ' *************************************************
  1397. > PROCEDURE mb_berechnen
  1398.   mb_hf#=VAL(CHAR{{OB_SPEC(mbbaum2_adr%,hauptforderung&)}})/100
  1399.   IF mb_hf#=0  ! diese Eingabe wäre allerdings Unsinn
  1400.     mb_gk#=0
  1401.     mb_gebuehren#=0
  1402.     mb_auslagenpv#=0
  1403.     mb_mwst#=0
  1404.   ELSE
  1405.     GOSUB gebuehrenermittlung(mb_hf#,ostwestfaktor#,g3#,dummy#,dummy#,g10#,dummy#)
  1406.     GOSUB tag_absolut(VAL(LEFT$(DATE$,2)),VAL(MID$(DATE$,4,2)),VAL(RIGHT$(DATE$,2)),vor1995%)
  1407.     IF vor1995%>728599  ! aktuelles Tagesdatum nach 31.12.94
  1408.       GOSUB gerichtskostenermittlung(mb_hf#,gk5#,dummy#)
  1409.       mb_gk#=MAX(gk5#,25)  ! Mindestgerichtskosten 25.- DM ab 31.12.94, Zustellkosten entfallen
  1410.     ELSE  ! bis 31.12.94
  1411.       GOSUB gerichtskostenermittlung_alt(mb_hf#,gk5#,dummy#)
  1412.       mb_gk#=mb_agzahl%*gkzust#+MAX(gk5#,15)  ! Mindestgebühren 15.- DM zzgl. Zustellkosten
  1413.     ENDIF
  1414.     ' Erhöhung für jeden weiteren AS 3/10, insgesamt aber 10/10 + max. 20/10 Erhöhung
  1415.     mb_gebuehren#=(MIN(2*g10#,(mb_aszahl%-1)*g3#)+g10#)  ! in DM
  1416.     mb_auslagenpv#=ROUND(0.15*mb_gebuehren#+0.049,1)  ! auf Zehnerl aufrunden
  1417.     mb_auslagenpv#=MIN(mb_auslagenpv#,40)
  1418.     mb_mwst#=ROUND(mb_mitmwst%*mwstsatz#/100*(mb_gebuehren#+mb_auslagenpv#),2)
  1419.   ENDIF
  1420.   mb_nf#=VAL(CHAR{{OB_SPEC(mbbaum2_adr%,nebenforderung&)}})/100
  1421.   mb_auslagenast#=VAL(CHAR{{OB_SPEC(mbbaum2_adr%,mbauslagenast&)}})/100
  1422.   mb_kosten#=mb_gk#+mb_auslagenast#+mb_gebuehren#+mb_auslagenpv#+mb_mwst#
  1423.   mb_summe#=mb_hf#+mb_nf#+mb_kosten#
  1424.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbgk&,mb_gk#,8)
  1425.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbgebuehren&,mb_gebuehren#,8)
  1426.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbauslagenpv&,mb_auslagenpv#,7)
  1427.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbmwstpv&,mb_mwst#,8)
  1428.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbkosten&,mb_kosten#,12)
  1429.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbsumme&,mb_summe#,12)
  1430.   GOSUB objc_update(mbbaum2_adr%,mbkosten&)
  1431.   GOSUB objc_update(mbbaum2_adr%,mbgk&)
  1432.   GOSUB objc_update(mbbaum2_adr%,mbauslagenast&)
  1433.   GOSUB objc_update(mbbaum2_adr%,mbgebuehren&)
  1434.   GOSUB objc_update(mbbaum2_adr%,mbauslagenpv&)
  1435.   GOSUB objc_update(mbbaum2_adr%,mbmwstpv&)
  1436.   GOSUB objc_update(mbbaum2_adr%,mbsumme&)
  1437. RETURN
  1438. ' ***********************************************
  1439. > PROCEDURE zahleneingaben(tree%,obj%,laenge%)
  1440.   @select(tree%,obj%,TRUE)   ! Objekt als Zeichen zur Eingabebereitschaft invers
  1441.   GOSUB objc_update(tree%,obj%)
  1442.   eing$=""
  1443.   DO
  1444.     KEYGET a%
  1445.     a%=BYTE(a%)
  1446.     SELECT a%
  1447.     CASE 8  ! Backspace
  1448.       l%=LEN(eing$)
  1449.       eing$=LEFT$(eing$,MAX(l%-1,0))
  1450.     CASE 48 TO 57 ! 0 bis 9
  1451.       eing$=eing$+CHR$(a%)
  1452.     ENDSELECT
  1453.     EXIT IF a%=13  !Return
  1454.     @dm_zahlen_einsetzen(tree%,obj%,VAL(eing$)/100,laenge%)
  1455.     GOSUB objc_update(tree%,obj%)
  1456.   LOOP
  1457.   @select(tree%,obj%,FALSE)   ! Objekt wieder normal
  1458.   GOSUB objc_update(tree%,obj%)
  1459. RETURN
  1460. ' ***************************************************
  1461. > PROCEDURE mb_dazubuchen
  1462.   aufstellungsaenderung#=TRUE  ! für SPEICHERN ? -Abfrage benötigt
  1463.   GOSUB freiezeilefinden(1,freiezeile%)  ! bei Zeile 1 anfangen
  1464.   GOSUB altergebniszeileloeschen(freiezeile%)
  1465.   GOSUB freiezeilefinden(1,freiezeile%)  ! erneuern des wertes Freiezeile%
  1466.   ' HF-Datum aus Dialogbox nehmen für Haupt- und Nebenforderung; akt. Datum für MB-Kosten
  1467.   t%=VAL(LEFT$(CHAR{{OB_SPEC(rsc_adr%(mbbaum2&),mbhfdatum&)}},2))
  1468.   m%=VAL(MID$(CHAR{{OB_SPEC(rsc_adr%(mbbaum2&),mbhfdatum&)}},3,2))
  1469.   j%=VAL(RIGHT$(CHAR{{OB_SPEC(rsc_adr%(mbbaum2&),mbhfdatum&)}},2))
  1470.   GOSUB tag_absolut(t%,m%,j%,bdat%)
  1471.   '
  1472.   ' Hauptforderung einbuchen
  1473.   fdgdatum%(freiezeile%)=bdat%  ! Aktuelles Datum
  1474.   fdgart#(freiezeile%)=1  ! Hauptforderung
  1475.   betrag#(freiezeile%)=mb_hf#
  1476.   restbetrag#(freiezeile%)=mb_hf#
  1477.   @zahlenumwandlung(2,CHAR{{OB_SPEC(mbbaum2_adr%,mbzins&)}},zahl#,dummy#)
  1478.   zinssatz#(freiezeile%)=zahl#
  1479.   IF @selected(mbbaum2_adr%,mbueberdiskont&)=TRUE ! Negativ bei diskzins
  1480.     zinssatz#(freiezeile%)=zinssatz#(freiezeile%)*-1
  1481.   ENDIF
  1482.   IF @selected(mbbaum2_adr%,mbzinszustellg&)=TRUE ! Zinsen ab Zustellung
  1483.     zinsdatum%(freiezeile%)=-1  ! Ab Zustellung
  1484.   ELSE
  1485.     ' Datum neu lesen da andernfalls Klartext mit Punkten
  1486.     @datumsumwandlung(CHAR{{OB_SPEC(mbbaum2_adr%,mbzinsdat&)}},a%,dummy%)
  1487.     zinsdatum%(freiezeile%)=a%
  1488.   ENDIF
  1489.   INC freiezeile%
  1490.   '
  1491.   ' Nebenforderung einbuchen
  1492.   IF mb_nf#>0
  1493.     fdgart#(freiezeile%)=14  ! Andere Forderungen (Klartext)
  1494.     fdgname$(freiezeile%)="Nebenforderung"
  1495.     betrag#(freiezeile%)=mb_nf#
  1496.     restbetrag#(freiezeile%)=mb_hf#
  1497.     zinssatz#(freiezeile%)=0
  1498.     zinsdatum%(freiezeile%)=0
  1499.     fdgdatum%(freiezeile%)=bdat%  ! Aktuelles Datum
  1500.     INC freiezeile%
  1501.   ENDIF
  1502.   '
  1503.   ' MB-Kosten einbuchen
  1504.   ' Aktuelles Datum = Buchungsdatum der MB-Kosten
  1505.   t%=VAL(LEFT$(DATE$,2))
  1506.   m%=VAL(MID$(DATE$,4,2))
  1507.   j%=VAL(RIGHT$(DATE$,2))
  1508.   GOSUB tag_absolut(t%,m%,j%,bdat%)
  1509.   '
  1510.   fdgart#(freiezeile%)=3  ! MB-Kosten
  1511.   betrag#(freiezeile%)=mb_kosten#
  1512.   restbetrag#(freiezeile%)=mb_kosten#
  1513.   zinssatz#(freiezeile%)=4
  1514.   zinsdatum%(freiezeile%)=-2  ! ab Erlaß des VB
  1515.   fdgdatum%(freiezeile%)=bdat%  ! Aktuelles Datum
  1516. RETURN
  1517. ' ***********************************************
  1518. > PROCEDURE mb_voreinstellungen
  1519.   @resource_einrichten(2)
  1520.   mbvoreinstbaum_adr%=rsc_adr%(mbvoreinstbaum&)
  1521.   @dialog_positionieren(mbvoreinstbaum&)
  1522.   ' Voreinstellungen setzen
  1523.   CHAR{{OB_SPEC(mbvoreinstbaum_adr%,eigensache&)}}=eigensache$
  1524.   @select(mbvoreinstbaum_adr%,mbvmwst&,mwst_trotz_vorsteuerabzug%)
  1525.   IF ostwestfaktor#=1
  1526.     @select(mbvoreinstbaum_adr%,mbvwestgeb&,TRUE)
  1527.     @select(mbvoreinstbaum_adr%,mbvostgeb&,FALSE)
  1528.     @select(mbvoreinstbaum_adr%,mbvkeinegeb&,FALSE)
  1529.   ELSE IF ostwestfaktor#=0.8
  1530.     @select(mbvoreinstbaum_adr%,mbvwestgeb&,FALSE)
  1531.     @select(mbvoreinstbaum_adr%,mbvostgeb&,TRUE)
  1532.     @select(mbvoreinstbaum_adr%,mbvkeinegeb&,FALSE)
  1533.   ELSE IF ostwestfaktor#=0
  1534.     @select(mbvoreinstbaum_adr%,mbvwestgeb&,FALSE)
  1535.     @select(mbvoreinstbaum_adr%,mbvostgeb&,FALSE)
  1536.     @select(mbvoreinstbaum_adr%,mbvkeinegeb&,TRUE)
  1537.   ENDIF
  1538.   @rsc_draw(mbvoreinstbaum&,fensterdial%)
  1539.   ex_obj%=@rsc_do(mbvoreinstbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  1540.   rsc_back(mbvoreinstbaum&)
  1541.   IF ex_obj%=mbvok&  ! Änderungen auslesen
  1542.     optionsaenderung%=TRUE
  1543.     IF @selected(mbvoreinstbaum_adr%,mbvwestgeb&)=TRUE
  1544.       ostwestfaktor#=1
  1545.     ELSE IF @selected(mbvoreinstbaum_adr%,mbvostgeb&)=TRUE
  1546.       ostwestfaktor#=0.8
  1547.     ELSE IF @selected(mbvoreinstbaum_adr%,mbvkeinegeb&)=TRUE
  1548.       ostwestfaktor#=0
  1549.     ENDIF
  1550.     mwst_trotz_vorsteuerabzug%=@selected(mbvoreinstbaum_adr%,mbvmwst&)
  1551.     eigensache$=CHAR{{OB_SPEC(mbvoreinstbaum_adr%,eigensache&)}}
  1552.   ENDIF
  1553.   @select(mbvoreinstbaum_adr%,ex_obj%,FALSE)
  1554.   @resource_einrichten(1)
  1555. RETURN
  1556. ' **************************************************
  1557. > PROCEDURE mb_muster_speichern(filesel%)  ! TRUE: mit Fileselectbox
  1558.   ' Alten Pfad retten
  1559.   alt_pfad$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)
  1560.   IF abbruch%=TRUE
  1561.     GOTO mb_muster_speichern_ende
  1562.   ENDIF
  1563.   IF filesel%=TRUE
  1564.     mb_dateiname$=@fileselect$("MB-Muster sichern",boot_pfad$+"\PRT\MB\*.MB","SICHERN.MB")
  1565.   ELSE
  1566.     mb_dateiname$=boot_pfad$+"\PRT\MB\STANDARD.MB"
  1567.   ENDIF
  1568.   IF mb_dateiname$="" OR RIGHT$(mb_dateiname$)="\"
  1569.     abbruch%=TRUE
  1570.     GOTO mb_muster_speichern_ende
  1571.   ELSE
  1572.     OPEN "O",#1,mb_dateiname$
  1573.   ENDIF
  1574.   '
  1575.   ' Erstes MB-Formular
  1576.   mbbaum1_adr%=rsc_adr%(mbbaum1&)
  1577.   WRITE #1,version#,mb_mitmwst%
  1578.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,mahngericht&)}}
  1579.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,agzahl&)}}
  1580.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,aszahl&)}}
  1581.   ' Voreinstellung Antragsgegner
  1582.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,ag1&)}}
  1583.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,ag2&)}}
  1584.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,ag3&)}}
  1585.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,ag4&)}}
  1586.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,ag5&)}}
  1587.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,ag6&)}}
  1588.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,ag7&)}}
  1589.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,ag8&)}}
  1590.   ' MB-Art
  1591.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,mbartpopup&)}}
  1592.   ' Voreinstellung Antragsteller
  1593.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}}
  1594.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,as2&)}}
  1595.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,as3&)}}
  1596.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,as4&)}}
  1597.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,as5&)}}
  1598.   ' Voreinstellung gesamtschuldner
  1599.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,gesschuldner1&)}}
  1600.   WRITE #1,CHAR{{OB_SPEC(mbbaum1_adr%,gesschuldner2&)}}
  1601.   WRITE #1,@selected(mbbaum1_adr%,gesschuld&)  ! Gesamtschuldnerschaftvoreinstellg.
  1602.   '
  1603.   ' Zweites MB-Formular
  1604.   mbbaum2_adr%=rsc_adr%(mbbaum2&)
  1605.   ' Voreinstellung mb-aktenzeichen
  1606.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbaz&)}}
  1607.   ' voreinstellung anspruchsbezeichnung
  1608.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,anspruch1&)}}
  1609.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,anspruch2&)}}
  1610.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,anspruch3&)}}
  1611.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,anspruch4&)}}
  1612.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,anspruch5&)}}
  1613.   ' Voreinstellung mb-zinsen,gegenleistung
  1614.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbzins&)}}
  1615.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbzinsdat&)}}
  1616.   WRITE #1,@selected(mbbaum1_adr%,mbzinszustellg&)
  1617.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,zinsen1&)}}
  1618.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,zinsen2&)}}
  1619.   WRITE #1,@selected(mbbaum2_adr%,ohneggleistg&)
  1620.   WRITE #1,@selected(mbbaum2_adr%,ggleistgerbracht&)
  1621.   ' Voreinstellung Forderungen und Kosten
  1622.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,hauptforderung&)}}
  1623.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,nebenforderung&)}}
  1624.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbkosten&)}}
  1625.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbsumme&)}}
  1626.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbgk&)}}
  1627.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbauslagenast&)}}
  1628.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbgebuehren&)}}
  1629.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbauslagenpv&)}}
  1630.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbmwstpv&)}}
  1631.   ' Voreinstellung Streitgericht, Ort und Datum
  1632.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,streitgericht&)}}
  1633.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,mbort&)}}
  1634.   ' Voreinstellung Parteivertreter
  1635.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,pv1&)}}
  1636.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,pv2&)}}
  1637.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,pv3&)}}
  1638.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,pv4&)}}
  1639.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,pv5&)}}
  1640.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,pv6&)}}
  1641.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,pv7&)}}
  1642.   WRITE #1,CHAR{{OB_SPEC(mbbaum2_adr%,pv8&)}}
  1643.   WRITE #1,@selected(mbbaum1_adr%,mbstreitverf&)
  1644.   WRITE #1,@selected(mbbaum1_adr%,mbvollmacht&)
  1645.   WRITE #1,@selected(mbbaum1_adr%,mbvorsteuer&)
  1646.   '
  1647.   CLOSE #1
  1648.   '
  1649. mb_muster_speichern_ende:
  1650.   CHDIR alt_pfad$  ! Zurück zum alten Pfad
  1651. RETURN
  1652. ' ***************************************************************
  1653. > PROCEDURE mb_muster_laden(filesel%)  ! TRUE: mit Fileselectbox
  1654.   ' Alten Pfad retten
  1655.   alt_pfad$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)
  1656.   IF filesel%=TRUE
  1657.     mb_dateiname$=@fileselect$("MB-Muster laden",boot_pfad$+"\PRT\MB\*.MB","LADEN.MB")
  1658.   ELSE
  1659.     mb_dateiname$=boot_pfad$+"\PRT\MB\STANDARD.MB"
  1660.   ENDIF
  1661.   IF EXIST(mb_dateiname$)=TRUE
  1662.     OPEN "I",#1,mb_dateiname$
  1663.   ELSE
  1664.     a$="MB-Datei "+name_der_datei$+"|wurde nicht gefunden !|Bitte erzeugen und nochmal|probieren."
  1665.     ~@rsc_alert(1,a$," [OK ",1)
  1666.     abbruch%=TRUE
  1667.     GOTO mb_muster_laden_ende
  1668.   ENDIF
  1669.   '
  1670.   ' Erstes MB-Formular
  1671.   mbbaum1_adr%=rsc_adr%(mbbaum1&)
  1672.   INPUT #1,dummy#,mb_mitmwst%  ! Dummy=Version
  1673.   INPUT #1,a$,b$,c$
  1674.   CHAR{{OB_SPEC(mbbaum1_adr%,mahngericht&)}}=a$
  1675.   CHAR{{OB_SPEC(mbbaum1_adr%,agzahl&)}}=STR$(VAL(b$),2)
  1676.   CHAR{{OB_SPEC(mbbaum1_adr%,aszahl&)}}=STR$(VAL(c$),2)
  1677.   '
  1678.   ' Voreinstellung Antragsgegner
  1679.   INPUT #1,a$,b$,c$
  1680.   CHAR{{OB_SPEC(mbbaum1_adr%,ag1&)}}=a$
  1681.   CHAR{{OB_SPEC(mbbaum1_adr%,ag2&)}}=b$
  1682.   CHAR{{OB_SPEC(mbbaum1_adr%,ag3&)}}=c$
  1683.   INPUT #1,a$,b$,c$
  1684.   CHAR{{OB_SPEC(mbbaum1_adr%,ag4&)}}=a$
  1685.   CHAR{{OB_SPEC(mbbaum1_adr%,ag5&)}}=b$
  1686.   CHAR{{OB_SPEC(mbbaum1_adr%,ag6&)}}=c$
  1687.   INPUT #1,a$,b$,c$
  1688.   CHAR{{OB_SPEC(mbbaum1_adr%,ag7&)}}=a$
  1689.   CHAR{{OB_SPEC(mbbaum1_adr%,ag8&)}}=b$
  1690.   ' MB-Art
  1691.   IF LEN(c$)=13  ! Diese 3 Zeilen bracht Mark nicht, da Sie nur aus
  1692.     c$=" "+c$    ! einer Änderung des MB-Speicherformats resultieren
  1693.   ENDIF
  1694.   CHAR{{OB_SPEC(mbbaum1_adr%,mbartpopup&)}}=c$
  1695.   '
  1696.   ' Voreinstellung Antragsteller
  1697.   INPUT #1,a$,b$,c$
  1698.   CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}}=a$
  1699.   CHAR{{OB_SPEC(mbbaum1_adr%,as2&)}}=b$
  1700.   CHAR{{OB_SPEC(mbbaum1_adr%,as3&)}}=c$
  1701.   INPUT #1,a$,b$
  1702.   CHAR{{OB_SPEC(mbbaum1_adr%,as4&)}}=a$
  1703.   CHAR{{OB_SPEC(mbbaum1_adr%,as5&)}}=b$
  1704.   ' Voreinstellung gesamtschuldner
  1705.   INPUT #1,a$,b$
  1706.   CHAR{{OB_SPEC(mbbaum1_adr%,gesschuldner1&)}}=a$
  1707.   CHAR{{OB_SPEC(mbbaum1_adr%,gesschuldner2&)}}=LEFT$(b$,57)  ! wg. Versionsänderung
  1708.   INPUT #1,dummy%
  1709.   @select(mbbaum1_adr%,gesschuld&,dummy%)  ! Gesamtschuldnerschaftvoreinstellg.
  1710.   '
  1711.   ' Zweites MB-Formular
  1712.   mbbaum2_adr%=rsc_adr%(mbbaum2&)
  1713.   INPUT #1,a$,b$,c$
  1714.   ' Voreinstellung mb-aktenzeichen
  1715.   CHAR{{OB_SPEC(mbbaum2_adr%,mbaz&)}}=a$
  1716.   ' voreinstellung anspruchsbezeichnung
  1717.   CHAR{{OB_SPEC(mbbaum2_adr%,anspruch1&)}}=b$
  1718.   CHAR{{OB_SPEC(mbbaum2_adr%,anspruch2&)}}=c$
  1719.   INPUT #1,a$,b$,c$
  1720.   CHAR{{OB_SPEC(mbbaum2_adr%,anspruch3&)}}=a$
  1721.   CHAR{{OB_SPEC(mbbaum2_adr%,anspruch4&)}}=b$
  1722.   CHAR{{OB_SPEC(mbbaum2_adr%,anspruch5&)}}=c$
  1723.   ' Voreinstellung mb-zinsen
  1724.   INPUT #1,a$,b$
  1725.   CHAR{{OB_SPEC(mbbaum2_adr%,mbzins&)}}=a$
  1726.   CHAR{{OB_SPEC(mbbaum2_adr%,mbzinsdat&)}}=b$
  1727.   INPUT #1,dummy%
  1728.   @select(mbbaum1_adr%,mbzinszustellg&,dummy%)  ! Gesamtschuldnerschaftvoreinstellg.
  1729.   INPUT #1,a$,b$
  1730.   CHAR{{OB_SPEC(mbbaum2_adr%,zinsen1&)}}=LEFT$(a$,48)  ! wg. Versionsäbderung
  1731.   CHAR{{OB_SPEC(mbbaum2_adr%,zinsen2&)}}=LEFT$(b$,48)  ! wg. Versionsänderung
  1732.   INPUT #1,dummy%
  1733.   @select(mbbaum2_adr%,ohneggleistg&,dummy%)
  1734.   INPUT #1,dummy%
  1735.   @select(mbbaum2_adr%,ggleistgerbracht&,dummy%)
  1736.   ' Voreinstellung Forderungen und Kosten
  1737.   INPUT #1,a$,b$,c$
  1738.   CHAR{{OB_SPEC(mbbaum2_adr%,hauptforderung&)}}=a$
  1739.   CHAR{{OB_SPEC(mbbaum2_adr%,nebenforderung&)}}=b$
  1740.   CHAR{{OB_SPEC(mbbaum2_adr%,mbkosten&)}}=c$
  1741.   INPUT #1,a$,b$,c$
  1742.   CHAR{{OB_SPEC(mbbaum2_adr%,mbsumme&)}}=a$
  1743.   CHAR{{OB_SPEC(mbbaum2_adr%,mbgk&)}}=b$
  1744.   CHAR{{OB_SPEC(mbbaum2_adr%,mbauslagenast&)}}=c$
  1745.   INPUT #1,a$,b$,c$
  1746.   CHAR{{OB_SPEC(mbbaum2_adr%,mbgebuehren&)}}=a$
  1747.   CHAR{{OB_SPEC(mbbaum2_adr%,mbauslagenpv&)}}=b$
  1748.   CHAR{{OB_SPEC(mbbaum2_adr%,mbmwstpv&)}}=c$
  1749.   ' Voreinstellung Streitgericht, Ort und Datum
  1750.   INPUT #1,a$,b$
  1751.   CHAR{{OB_SPEC(mbbaum2_adr%,streitgericht&)}}=a$
  1752.   CHAR{{OB_SPEC(mbbaum2_adr%,mbort&)}}=LEFT$(b$+DATE$,30)
  1753.   ' Voreinstellung Parteivertreter
  1754.   INPUT #1,a$,b$,c$
  1755.   CHAR{{OB_SPEC(mbbaum2_adr%,pv1&)}}=a$
  1756.   CHAR{{OB_SPEC(mbbaum2_adr%,pv2&)}}=b$
  1757.   CHAR{{OB_SPEC(mbbaum2_adr%,pv3&)}}=c$
  1758.   INPUT #1,a$,b$,c$
  1759.   CHAR{{OB_SPEC(mbbaum2_adr%,pv4&)}}=a$
  1760.   CHAR{{OB_SPEC(mbbaum2_adr%,pv5&)}}=b$
  1761.   CHAR{{OB_SPEC(mbbaum2_adr%,pv6&)}}=c$
  1762.   INPUT #1,a$,b$
  1763.   CHAR{{OB_SPEC(mbbaum2_adr%,pv7&)}}=a$
  1764.   CHAR{{OB_SPEC(mbbaum2_adr%,pv8&)}}=b$
  1765.   INPUT #1,dummy%
  1766.   @select(mbbaum1_adr%,mbstreitverf&,dummy%)
  1767.   INPUT #1,dummy%
  1768.   @select(mbbaum1_adr%,mbvollmacht&,dummy%)
  1769.   INPUT #1,dummy%
  1770.   @select(mbbaum1_adr%,mbvorsteuer&,dummy%)
  1771.   '
  1772.   CLOSE #1
  1773.   '
  1774. mb_muster_laden_ende:
  1775.   CHDIR alt_pfad$  ! Zurück zum alten Pfad
  1776. RETURN
  1777. ' ***************************************************************
  1778. > PROCEDURE mb_daten_einsetzen  ! (aus der Forderungsberechnung)
  1779.   ' Erstes MB-Formular
  1780.   mbbaum1_adr%=rsc_adr%(mbbaum1&)
  1781.   ' Voreinstellung Mahngericht
  1782.   CHAR{{OB_SPEC(mbbaum1_adr%,mahngericht&)}}=LEFT$(standardadressatort$,32)
  1783.   ' Voreinstellung Antragsgegner
  1784.   CHAR{{OB_SPEC(mbbaum1_adr%,agzahl&)}}=STR$(mb_agzahl%,2)
  1785.   CHAR{{OB_SPEC(mbbaum1_adr%,aszahl&)}}=STR$(mb_aszahl%,2)
  1786.   CHAR{{OB_SPEC(mbbaum1_adr%,ag1&)}}=""
  1787.   CHAR{{OB_SPEC(mbbaum1_adr%,ag2&)}}=LEFT$(schuldneranrede1$,34)
  1788.   IF schuldnergf1$<>""
  1789.     CHAR{{OB_SPEC(mbbaum1_adr%,ag3&)}}="vertreten durch"
  1790.     CHAR{{OB_SPEC(mbbaum1_adr%,ag4&)}}=LEFT$(schuldnergf1$,34)
  1791.   ELSE
  1792.     CHAR{{OB_SPEC(mbbaum1_adr%,ag3&)}}=""
  1793.     CHAR{{OB_SPEC(mbbaum1_adr%,ag4&)}}=""
  1794.   ENDIF
  1795.   CHAR{{OB_SPEC(mbbaum1_adr%,ag5&)}}=""
  1796.   CHAR{{OB_SPEC(mbbaum1_adr%,ag6&)}}=LEFT$(schuldnerstrasse$,34)
  1797.   CHAR{{OB_SPEC(mbbaum1_adr%,ag7&)}}=""
  1798.   CHAR{{OB_SPEC(mbbaum1_adr%,ag8&)}}=LEFT$(schuldnerort$,34)
  1799.   '
  1800.   ' Voreinstellung Antragsteller mit Wordwrap
  1801.   a$=glaeubigeranrede1$+", "+glaeubigerstrasse$+", "+glaeubigerort$+" "
  1802.   lzpos%=RINSTR(a$," ",65)
  1803.   CHAR{{OB_SPEC(mbbaum1_adr%,as1&)}}=LEFT$(a$,lzpos%-1)
  1804.   CHAR{{OB_SPEC(mbbaum1_adr%,as2&)}}=TRIM$(MID$(a$,lzpos%+1,65))
  1805.   IF glaeubigergf1$<>""
  1806.     CHAR{{OB_SPEC(mbbaum1_adr%,as3&)}}=LEFT$("vertr. durch "+glaeubigergf1$,65)
  1807.   ELSE
  1808.     CHAR{{OB_SPEC(mbbaum1_adr%,as3&)}}=""
  1809.   ENDIF
  1810.   a$="Prozeßbev.: "+useranrede1$+" "+useranrede2$+", "+userstr$+", "+userort$+", "+userbank$+" Konto "+userkto$+" BLZ "+userblz$+" "
  1811.   lzpos%=RINSTR(a$," ",65)
  1812.   CHAR{{OB_SPEC(mbbaum1_adr%,as4&)}}=LEFT$(a$,lzpos%-1)
  1813.   CHAR{{OB_SPEC(mbbaum1_adr%,as5&)}}=TRIM$(MID$(a$,lzpos%+1,65))
  1814.   ' Voreinstellung gesamtschuldner
  1815.   CHAR{{OB_SPEC(mbbaum1_adr%,gesschuldner1&)}}=""
  1816.   CHAR{{OB_SPEC(mbbaum1_adr%,gesschuldner2&)}}=""
  1817.   @select(mbbaum1_adr%,gesschuld&,FALSE)  ! keine Gesamtschuldnerschaft voreingestellt
  1818.   '
  1819.   ' Zweites MB-Formular
  1820.   mbbaum2_adr%=rsc_adr%(mbbaum2&)
  1821.   ' Voreinstellung mb-aktenzeichen
  1822.   CHAR{{OB_SPEC(mbbaum2_adr%,mbaz&)}}=LEFT$(az$,20)
  1823.   ' voreinstellung anspruchsbezeichnung
  1824.   FOR i%=anspruch1& TO anspruch5&
  1825.     CHAR{{OB_SPEC(mbbaum2_adr%,i%)}}=""
  1826.   NEXT i%
  1827.   ' Voreinstellung mb-zinsen
  1828.   CHAR{{OB_SPEC(mbbaum2_adr%,mbzins&)}}=""
  1829.   CHAR{{OB_SPEC(mbbaum2_adr%,mbzinsdat&)}}=""
  1830.   FOR i%=zinsen1& TO zinsen3&
  1831.     CHAR{{OB_SPEC(mbbaum2_adr%,i%)}}=""
  1832.   NEXT i%
  1833.   ' Voreinstellung Forderungen und Kosten
  1834.   @dm_zahlen_einsetzen(mbbaum2_adr%,hauptforderung&,0,12)
  1835.   @dm_zahlen_einsetzen(mbbaum2_adr%,nebenforderung&,0,12)
  1836.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbkosten&,0,12)
  1837.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbsumme&,0,12)
  1838.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbgk&,0,8)
  1839.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbauslagenast&,0,7)
  1840.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbgebuehren&,0,8)
  1841.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbauslagenpv&,0,7)
  1842.   @dm_zahlen_einsetzen(mbbaum2_adr%,mbmwstpv&,0,8)
  1843.   ' Voreinstellung Streitgericht, Ort und Datum
  1844.   CHAR{{OB_SPEC(mbbaum2_adr%,streitgericht&)}}=standardadressatort$
  1845.   a$=MID$(userort$,INSTR(userort$," "))+", den "+DATE$
  1846.   IF LEN(a$)>30
  1847.     a$=MID$(userort$,INSTR(userort$," "))+", "+DATE$
  1848.   ENDIF
  1849.   CHAR{{OB_SPEC(mbbaum2_adr%,mbort&)}}=LEFT$(a$,30)
  1850.   ' Voreinstellung Parteivertreter
  1851.   CHAR{{OB_SPEC(mbbaum2_adr%,pv1&)}}=""
  1852.   CHAR{{OB_SPEC(mbbaum2_adr%,pv2&)}}=LEFT$(useranrede1$,32)
  1853.   CHAR{{OB_SPEC(mbbaum2_adr%,pv3&)}}=""
  1854.   CHAR{{OB_SPEC(mbbaum2_adr%,pv4&)}}=LEFT$(useranrede2$,32)
  1855.   CHAR{{OB_SPEC(mbbaum2_adr%,pv5&)}}=""
  1856.   CHAR{{OB_SPEC(mbbaum2_adr%,pv6&)}}=LEFT$(userstr$,32)
  1857.   CHAR{{OB_SPEC(mbbaum2_adr%,pv7&)}}=""
  1858.   CHAR{{OB_SPEC(mbbaum2_adr%,pv8&)}}=LEFT$(userort$,32)
  1859. RETURN
  1860. ' +*************************************************************
  1861. '
  1862. ' Vollstreckungsbescheid
  1863. ' ----------------------
  1864. ' *************************************************
  1865. > PROCEDURE vb
  1866.   GOSUB freiezeilefinden(1,freiezeile%)
  1867.   IF freiezeile%=1
  1868.     ' Abbrechen wenn keine Fdg-berechnung im Speicher ist
  1869.     ~@rsc_alert(1,"VB-Erstellung sinnlos, da|keine Forderungsberechnung|im Speicher ist.","[OK",1)
  1870.     GOTO vb_ende
  1871.   ELSE  ! Forderungsberechnung im Speicher
  1872.     dummy%=FALSE
  1873.     FOR i%=1 TO freiezeile%
  1874.       IF fdgart#(i%)=3  ! MB
  1875.         dummy%=TRUE
  1876.       ENDIF
  1877.     NEXT i%
  1878.     IF dummy%=FALSE
  1879.       ' Abbrechen wenn kein MB gemacht wurde
  1880.       ~@rsc_alert(1,"VB-Erstellung sinnlos, da|in dieser Sache kein MB |erstellt wurde.","[OK",1)
  1881.       GOTO vb_ende
  1882.     ENDIF
  1883.   ENDIF
  1884.   '
  1885.   ' Dialog vorbereiten und durchführen
  1886.   @resource_einrichten(2)  ! Zweitresource
  1887.   vbbaum_adr%=rsc_adr%(vbbaum&)
  1888.   @dialog_positionieren(vbbaum&)
  1889.   '
  1890.   ' Voreinstellung des Formulars
  1891.   IF gerichtszustellung%=TRUE  ! Variable ist mit optionen gespeichert
  1892.     @select(vbbaum_adr%,vbzustgericht&,TRUE)
  1893.     @select(vbbaum_adr%,vbzustpartei&,FALSE)
  1894.   ELSE
  1895.     @select(vbbaum_adr%,vbzustgericht&,FALSE)
  1896.     @select(vbbaum_adr%,vbzustpartei&,TRUE)
  1897.   ENDIF
  1898.   IF vb_drucken%=TRUE  ! VB immer drucken?
  1899.     @select(vbbaum_adr%,vbdrucken&,TRUE)
  1900.   ELSE
  1901.     @select(vbbaum_adr%,vbdrucken&,FALSE)
  1902.   ENDIF
  1903.   IF ostwestfaktor#=1
  1904.     CHAR{{OB_SPEC(vbbaum_adr%,vbwestost&)}}="West"
  1905.   ELSE IF ostwestfaktor#=0.8
  1906.     CHAR{{OB_SPEC(vbbaum_adr%,vbwestost&)}}="Ost "
  1907.   ELSE IF ostwestfaktor#=0
  1908.     CHAR{{OB_SPEC(vbbaum_adr%,vbwestost&)}}="ohne"
  1909.   ENDIF
  1910.   @select(vbbaum_adr%,vbdazubuchen&,TRUE)
  1911.   @select(vbbaum_adr%,vbkeinezahlung&,TRUE)
  1912.   FOR i%=vbzahlungsbox& TO vbzahlgcheck3&
  1913.     GOSUB do_objc(vbbaum_adr%,i%,&H8) ! helle Darstellung
  1914.   NEXT i%
  1915.   GOSUB del_flag(vbbaum_adr%,vbzahlgdatum1&,8) ! nicht editierbar
  1916.   GOSUB del_flag(vbbaum_adr%,vbzahlgdatum2&,8) ! nicht editierbar
  1917.   GOSUB del_flag(vbbaum_adr%,vbzahlgdatum3&,8) ! nicht editierbar
  1918.   GOSUB del_flag(vbbaum_adr%,vbzahlung1&,8) ! nicht editierbar
  1919.   GOSUB del_flag(vbbaum_adr%,vbzahlung2&,8) ! nicht editierbar
  1920.   GOSUB del_flag(vbbaum_adr%,vbzahlung3&,8) ! nicht editierbar
  1921.   CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum1&)}}=""
  1922.   CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung1&)}}=""
  1923.   CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum2&)}}=""
  1924.   CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung2&)}}=""
  1925.   CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum3&)}}=""
  1926.   CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung3&)}}=""
  1927.   @select(vbbaum_adr%,vbobigezahlung&,FALSE)
  1928.   @select(vbbaum_adr%,vbobigebetraege&,TRUE)
  1929.   @select(vbbaum_adr%,vbteilbetrag&,FALSE)
  1930.   ' Summe der Hauptforderungen einsetzen
  1931.   @freiezeilefinden(1,freiezeile%)
  1932.   vb_hfsum1#=0
  1933.   FOR i%=1 TO freiezeile%-1
  1934.     IF fdgart#(i%)=1  ! Hauptforderung
  1935.       ADD vb_hfsum1#,betrag#(i%)
  1936.     ENDIF
  1937.   NEXT i%
  1938.   dm_zahlen_einsetzen(vbbaum_adr%,vbhfsum1&,vb_hfsum1#,12)
  1939.   dm_zahlen_einsetzen(vbbaum_adr%,vbhfsum2&,0,12)
  1940.   ' Voreinstellung des Datums der VB-Erstellung mit aktuellem Datum
  1941.   CHAR{{OB_SPEC(vbbaum_adr%,vbdatum&)}}=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  1942.   '
  1943.   ' Vorbereitung des Dialogs
  1944.   @rsc_draw(vbbaum&,fensterdial%)
  1945.   @vb_berechnen(TRUE)
  1946.   erstes_objekt%=vbzahlgdatum1&
  1947. neu_vb:
  1948.   ex_obj%=@rsc_do(vbbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  1949.   SELECT ex_obj%
  1950.   CASE vbobigebetraege&
  1951.     @zahleneingaben(vbbaum_adr%,vbhfsum1&,12)
  1952.     @vb_berechnen(TRUE)
  1953.     GOTO neu_vb
  1954.   CASE vbteilbetrag&
  1955.     @zahleneingaben(vbbaum_adr%,vbhfsum2&,12)
  1956.     @vb_berechnen(TRUE)
  1957.     GOTO neu_vb
  1958.   CASE vbgk&
  1959.     @zahleneingaben(vbbaum_adr%,vbgk&,9)
  1960.     @vb_berechnen(FALSE)
  1961.     GOTO neu_vb
  1962.   CASE vbgebuehren&
  1963.     @zahleneingaben(vbbaum_adr%,vbgebuehren&,10)
  1964.     @vb_berechnen(FALSE)
  1965.     GOTO neu_vb
  1966.   CASE vbauslagen&
  1967.     @zahleneingaben(vbbaum_adr%,vbauslagen&,7)
  1968.     @vb_berechnen(FALSE)
  1969.     GOTO neu_vb
  1970.   CASE vbmwst&
  1971.     IF mb_mitmwst%=1
  1972.       mb_mitmwst%=0
  1973.     ELSE
  1974.       mb_mitmwst%=1
  1975.     ENDIF
  1976.     @vb_berechnen(TRUE)
  1977.     GOTO neu_vb
  1978.   CASE vbkeinezahlung&
  1979.     CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum1&)}}=""
  1980.     CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung1&)}}=""
  1981.     CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum2&)}}=""
  1982.     CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung2&)}}=""
  1983.     CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum3&)}}=""
  1984.     CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung3&)}}=""
  1985.     GOSUB del_flag(vbbaum_adr%,vbzahlgdatum1&,8) ! nicht editierbar
  1986.     GOSUB del_flag(vbbaum_adr%,vbzahlgdatum2&,8) ! nicht editierbar
  1987.     GOSUB del_flag(vbbaum_adr%,vbzahlgdatum3&,8) ! nicht editierbar
  1988.     GOSUB del_flag(vbbaum_adr%,vbzahlung1&,8) ! nicht editierbar
  1989.     GOSUB del_flag(vbbaum_adr%,vbzahlung2&,8) ! nicht editierbar
  1990.     GOSUB del_flag(vbbaum_adr%,vbzahlung3&,8) ! nicht editierbar
  1991.     FOR i%=vbzahlungsbox& TO vbzahlgcheck3&
  1992.       GOSUB do_objc(vbbaum_adr%,i%,&H8) ! helle Darstellung
  1993.       @objc_update(vbbaum_adr%,i%)
  1994.     NEXT i%
  1995.     GOTO neu_vb
  1996.   CASE vbobigezahlung&
  1997.     GOSUB set_flag(vbbaum_adr%,vbzahlgdatum1&,8) !  editierbar
  1998.     GOSUB set_flag(vbbaum_adr%,vbzahlgdatum2&,8) !  editierbar
  1999.     GOSUB set_flag(vbbaum_adr%,vbzahlgdatum3&,8) !  editierbar
  2000.     GOSUB set_flag(vbbaum_adr%,vbzahlung1&,8) !  editierbar
  2001.     GOSUB set_flag(vbbaum_adr%,vbzahlung2&,8) !  editierbar
  2002.     GOSUB set_flag(vbbaum_adr%,vbzahlung3&,8) !  editierbar
  2003.     FOR i%=vbzahlungsbox& TO vbzahlgcheck3&
  2004.       GOSUB undo_objc(vbbaum_adr%,i%,&H8) ! normale Darstellung
  2005.       @objc_update(vbbaum_adr%,i%)
  2006.     NEXT i%
  2007.     GOTO neu_vb
  2008.   CASE vbzustgericht&
  2009.     optionsaenderung%=TRUE
  2010.     @vb_berechnen(TRUE)
  2011.     GOTO neu_vb
  2012.   CASE vbzustpartei&
  2013.     optionsaenderung%=TRUE
  2014.     @vb_berechnen(TRUE)
  2015.     GOTO neu_vb
  2016.   CASE vbok&
  2017.     @vb_buchen
  2018.     @vb_daten_auslesen
  2019.     IF @selected(vbbaum_adr%,vbdrucken&)=TRUE
  2020.       vb_drucken%=TRUE
  2021.       @vb_drucken
  2022.     ELSE
  2023.       vb_drucken%=FALSE
  2024.     ENDIF
  2025.     @forderungstextfeld
  2026.   ENDSELECT
  2027.   rsc_back(vbbaum&)
  2028.   @select(vbbaum_adr%,ex_obj%,FALSE)
  2029.   @resource_einrichten(1)  ! zurück zur Erstresource
  2030.   @redraw_part(0,0)  ! Damit Fenster wieder gefüllt wird
  2031.   ' Dialog beendet
  2032. vb_ende:
  2033. RETURN
  2034. ' ************************************************+
  2035. > PROCEDURE vb_berechnen(flag%)
  2036.   ' flag=true,wenn komplett bberechnet wird, false, wenn nur die Eintragungen quer
  2037.   ' von links nach rechts summiert werden sollen (also bei man. Eingaben)
  2038.   IF flag%=TRUE
  2039.     IF @selected(vbbaum_adr%,vbobigebetraege&)=TRUE
  2040.       sw#=(VAL(CHAR{{OB_SPEC(vbbaum_adr%,vbhfsum1&)}})/100)  ! wg Pfennig
  2041.       @zahlenumwandlung(8,CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung1&)}},dummy1#,kontrolle#)
  2042.       @zahlenumwandlung(8,CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung2&)}},dummy2#,kontrolle#)
  2043.       @zahlenumwandlung(8,CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung3&)}},dummy3#,kontrolle#)
  2044.       sw#=sw#-dummy1#-dummy2#-dummy3#
  2045.     ELSE
  2046.       sw#=(VAL(CHAR{{OB_SPEC(vbbaum_adr%,vbhfsum2&)}})/100)  ! wg Pfennig
  2047.     ENDIF
  2048.     ' Vorbereitung VB-Kostenfelder
  2049.     GOSUB tag_absolut(VAL(LEFT$(DATE$,2)),VAL(MID$(DATE$,4,2)),VAL(RIGHT$(DATE$,2)),vor1995%)
  2050.     IF vor1995%>728599  ! aktuelles Tagesdatum nach 31.12.94
  2051.       vb_gk#=0 ! Ab 1.1.95 Zustellkosten entfallen
  2052.     ELSE  ! bis 31.12.94
  2053.       vb_gk#=mb_agzahl%*gkzust#*(-1)*@selected(vbbaum_adr%,vbzustgericht&)  ! d.h. Null bei Selbstzustellung
  2054.     ENDIF
  2055.     dm_zahlen_einsetzen(vbbaum_adr%,vbgk&,vb_gk#,9)
  2056.     IF sw#>0
  2057.       GOSUB gebuehrenermittlung(sw#,ostwestfaktor#,dummy#,vb_gebuehren#,dummy#,dummy#,dummy#)
  2058.     ELSE
  2059.       vb_gebuehren#=0
  2060.     ENDIF
  2061.     dm_zahlen_einsetzen(vbbaum_adr%,vbgebuehren&,vb_gebuehren#,10)
  2062.     vb_auslagen#=ROUND(0.15*vb_gebuehren#+0.049,1)  ! auf Zehnerl aufrunden
  2063.     ' Rausfinden, wieviel Auslagen beim MB berechnet waren
  2064.     @gebuehrenermittlung(VAL(CHAR{{OB_SPEC(vbbaum_adr%,vbhfsum1&)}})/100,ostwestfaktor#,a#,dummy#,dummy#,b#,dummy#)
  2065.     ' a=3/10, b=10/10
  2066.     dummygebmb#=(MIN(2*b#,(mb_aszahl%-1)*a#)+b#)  ! in DM
  2067.     dummyauslmb#=MIN(40,ROUND(0.15*dummygebmb#+0.049,1))  ! auf Zehnerl aufrunden
  2068.     vb_auslagen#=MIN(40-dummyauslmb#,ROUND(0.15*vb_gebuehren#+0.049,1))  ! max für MB+VB 40 DM Berechnet aus Summe der HFs
  2069.     ' ALSO NICHT Immer richtig
  2070.     dm_zahlen_einsetzen(vbbaum_adr%,vbauslagen&,vb_auslagen#,7)
  2071.     vb_mwst#=ROUND((vb_gebuehren#+vb_auslagen#)*mwstsatz#/100,2)*mb_mitmwst%  ! 0 wenn ohne MwSt
  2072.     dm_zahlen_einsetzen(vbbaum_adr%,vbmwst&,vb_mwst#,8)
  2073.   ELSE  ! also flag=false
  2074.     vb_gk#=(VAL(TRIM$(CHAR{{OB_SPEC(vbbaum_adr%,vbgk&)}}))/100)  ! wg Pfennig
  2075.     vb_gebuehren#=(VAL(TRIM$(CHAR{{OB_SPEC(vbbaum_adr%,vbgebuehren&)}}))/100)
  2076.     vb_auslagen#=(VAL(TRIM$(CHAR{{OB_SPEC(vbbaum_adr%,vbauslagen&)}}))/100)  ! wg Pfennig
  2077.     vb_mwst#=ROUND((vb_gebuehren#+vb_auslagen#)*mwstsatz#/100,2)*mb_mitmwst%  ! 0 wenn ohne MwSt
  2078.     dm_zahlen_einsetzen(vbbaum_adr%,vbmwst&,vb_mwst#,8)
  2079.   ENDIF
  2080.   vb_summe#=vb_gk#+vb_gebuehren#+vb_auslagen#+vb_mwst#
  2081.   dm_zahlen_einsetzen(vbbaum_adr%,vbsumme&,vb_summe#,12)
  2082.   @objc_update(vbbaum_adr%,vbgk&)
  2083.   @objc_update(vbbaum_adr%,vbgebuehren&)
  2084.   @objc_update(vbbaum_adr%,vbauslagen&)
  2085.   @objc_update(vbbaum_adr%,vbmwst&)
  2086.   @objc_update(vbbaum_adr%,vbsumme&)
  2087. RETURN
  2088. ' ****************************************************
  2089. > PROCEDURE vb_buchen
  2090.   IF @selected(vbbaum_adr%,vbdazubuchen&)=TRUE AND VAL(TRIM$(CHAR{{OB_SPEC(vbbaum_adr%,vbsumme&)}}))>0
  2091.     aufstellungsaenderung#=TRUE  ! für SPEICHERN ? -Abfrage benötigt
  2092.     GOSUB freiezeilefinden(1,freiezeile%)  ! bei Zeile 1 anfangen
  2093.     GOSUB altergebniszeileloeschen(freiezeile%)
  2094.     GOSUB freiezeilefinden(1,freiezeile%)  ! erneuern des Wertes Freiezeile%
  2095.     '
  2096.     ' VB-Kosten einbuchen
  2097.     fdgart#(freiezeile%)=4  ! VB-Kosten
  2098.     @zahlenumwandlung(10,CHAR{{OB_SPEC(vbbaum_adr%,vbsumme&)}},dummy#,kontrolle#)
  2099.     betrag#(freiezeile%)=dummy#
  2100.     restbetrag#(freiezeile%)=dummy#
  2101.     zinssatz#(freiezeile%)=4
  2102.     zinsdatum%(freiezeile%)=-2  ! ab Erlaß des VB
  2103.     ' HF-Datum aus Dialogbox nehmen für Haupt- und Nebenforderung; akt. Datum für MB-Kosten
  2104.     t%=VAL(LEFT$(CHAR{{OB_SPEC(vbbaum_adr%,vbdatum&)}},2))
  2105.     m%=VAL(MID$(CHAR{{OB_SPEC(vbbaum_adr%,vbdatum&)}},3,2))
  2106.     j%=VAL(RIGHT$(CHAR{{OB_SPEC(vbbaum_adr%,vbdatum&)}},2))
  2107.     GOSUB tag_absolut(t%,m%,j%,bdat%)
  2108.     fdgdatum%(freiezeile%)=bdat%  ! Aktuelles Datum
  2109.   ENDIF
  2110.   '
  2111.   ' Zahlungen buchen falls angekreuzt und Betrag eingetragen
  2112.   IF @selected(vbbaum_adr%,vbzahlgcheck1&)=TRUE AND CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung1&)}}<>""
  2113.     @vb_zahlung_buchen(vbzahlgdatum1&,vbzahlung1&)
  2114.   ENDIF
  2115.   '
  2116.   ' Zahlungen buchen falls angekreuzt und Betrag eingetragen
  2117.   IF @selected(vbbaum_adr%,vbzahlgcheck2&)=TRUE AND CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung2&)}}<>""
  2118.     @vb_zahlung_buchen(vbzahlgdatum2&,vbzahlung2&)
  2119.   ENDIF
  2120.   '
  2121.   ' Zahlungen buchen falls angekreuzt und Betrag eingetragen
  2122.   IF @selected(vbbaum_adr%,vbzahlgcheck3&)=TRUE AND CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung3&)}}<>""
  2123.     @vb_zahlung_buchen(vbzahlgdatum3&,vbzahlung3&)
  2124.   ENDIF
  2125.   @nachdatensortieren
  2126.   @neuberechnung(1)
  2127. RETURN
  2128. ' ********************************************************
  2129. > PROCEDURE vb_zahlung_buchen(z&,b&)
  2130.   ' z=objektnummer der Zahlung, b des betrags
  2131.   aufstellungsaenderung#=TRUE  ! für SPEICHERN ? -Abfrage benötigt
  2132.   GOSUB freiezeilefinden(1,freiezeile%)  ! bei Zeile 1 anfangen
  2133.   GOSUB altergebniszeileloeschen(freiezeile%)
  2134.   GOSUB freiezeilefinden(1,freiezeile%)  ! erneuern des wertes Freiezeile%
  2135.   '
  2136.   @datumsumwandlung(CHAR{{OB_SPEC(vbbaum_adr%,z&)}},bdat%,dummy%)
  2137.   FOR z%=0 TO 3  ! Alle Zeilen auf Buchungsdatum setzen
  2138.     fdgdatum%(freiezeile%+z%)=bdat%  ! DAMIT BEIM SORTIEREN nichts rausfällt
  2139.   NEXT z%
  2140.   ' Zahlungszeilen einfügen
  2141.   fdgart#(freiezeile%)=20   ! gibt dann Zwischensumme
  2142.   fdgart#(freiezeile%+1)=15 ! Zahlung
  2143.   fdgart#(freiezeile%+2)=21 ! gibt dann Verrechnungszeile
  2144.   fdgart#(freiezeile%+3)=22 ! gibt dann Restsummenzeile
  2145.   @zahlenumwandlung(8,CHAR{{OB_SPEC(vbbaum_adr%,b&)}},dummy#,kontolle#)
  2146.   betrag#(freiezeile%+1)=dummy#
  2147.   restbetrag#(freiezeile%+1)=dummy#
  2148.   zinssatz#(freiezeile%+1)=4
  2149.   zinsdatum%(freiezeile%+1)=-1  ! ab Zustellung
  2150. RETURN
  2151. ' ************************************************
  2152. > PROCEDURE vb_daten_auslesen
  2153.   IF @selected(vbbaum_adr%,vbobigebetraege&)=TRUE
  2154.     vb_obbetr$="X"
  2155.     vb_teilbetrag$=" "
  2156.   ELSE
  2157.     vb_obbetr$=" "
  2158.     @zahlenumwandlung(8,CHAR{{obspec#(vbbaum_adr%,vbhfsum2#)}},dummy#,kontrolle#)
  2159.     vb_teilbetrag$="wegen DM "+STR$(dummy#)
  2160.   ENDIF
  2161.   IF @selected(vbbaum_adr%,vbzustgericht&)=TRUE
  2162.     vb_gerichtszustellung$="X"
  2163.     vb_parteizustellung$=" "
  2164.     gerichtszustellung%=TRUE
  2165.   ELSE
  2166.     vb_gerichtszustellung$=" "
  2167.     vb_parteizustellung$="X"
  2168.     gerichtszustellung%=FALSE
  2169.   ENDIF
  2170.   IF @selected(vbbaum_adr%,vbkeinezahlung&)=TRUE
  2171.     vb_zhlg1$="X"
  2172.     vb_zhlg2$=" "
  2173.     vb_zahlungen$=" "
  2174.   ELSE
  2175.     vb_zhlg1$="          "  !Weil es sonst die Länge ändert
  2176.     vb_zhlg2$="X"
  2177.     vb_zahlungen$=""  ! Initialisieren
  2178.     IF CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum1&)}}<>""  ! Etwas eingetragen
  2179.       @zahlenumwandlung(8,CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung1&)}},dummy#,kontrolle#)
  2180.       dummy$=CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum1&)}}
  2181.       vb_zahlungen$="DM"+STR$(dummy#)+" am "+LEFT$(dummy$,2)+"."+MID$(dummy$,3,2)+"."+MID$(dummy$,5)
  2182.     ENDIF
  2183.     IF CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum2&)}}<>""  ! Etwas eingetragen
  2184.       @zahlenumwandlung(8,CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung2&)}},dummy#,kontrolle#)
  2185.       dummy$=CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum2&)}}
  2186.       vb_zahlungen$=vb_zahlungen$+", DM"+STR$(dummy#)+" am "+LEFT$(dummy$,2)+"."+MID$(dummy$,3,2)+"."+MID$(dummy$,5)
  2187.     ENDIF
  2188.     IF CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum3&)}}<>""  ! Etwas eingetragen
  2189.       @zahlenumwandlung(8,CHAR{{OB_SPEC(vbbaum_adr%,vbzahlung3&)}},dummy#,kontrolle#)
  2190.       dummy$=CHAR{{OB_SPEC(vbbaum_adr%,vbzahlgdatum3&)}}
  2191.       vb_zahlungen$=vb_zahlungen$+", DM"+STR$(dummy#)+" am "+LEFT$(dummy$,2)+"."+MID$(dummy$,3,2)+"."+MID$(dummy$,5)
  2192.     ENDIF
  2193.   ENDIF
  2194.   '
  2195.   vb_gk$=CHAR{{OB_SPEC(vbbaum_adr%,vbgk&)}}
  2196.   vb_gebuehren$=CHAR{{OB_SPEC(vbbaum_adr%,vbgebuehren&)}}
  2197.   vb_auslagen$=CHAR{{OB_SPEC(vbbaum_adr%,vbauslagen&)}}
  2198.   vb_mwst$=CHAR{{OB_SPEC(vbbaum_adr%,vbmwst&)}}
  2199.   vb_summe$=CHAR{{OB_SPEC(vbbaum_adr%,vbsumme&)}}
  2200. RETURN
  2201. ' *****************************************************+
  2202. > PROCEDURE vb_drucken
  2203.   IF OUT?(0)=FALSE  !GEMDOS(17)=0
  2204.     IF @rsc_alert(1,"Bitte Schalten Sie|Ihren Drucker ein.","[OK|[Abbruch",1)
  2205.       abbruch%=1
  2206.       GOTO vb_druckende
  2207.     ENDIF
  2208.   ENDIF
  2209.   wasdrucken%=31  ! hier ist das VB-muster
  2210.   @druckerladen(2)  ! MB-Drucker Laden
  2211.   @ausgabestring_erstellen(TRUE)  ! mit Steuerzeichen
  2212.   '
  2213.   ' DRUCKBEGINN
  2214.   PRINT #0;initialisierung$;
  2215.   ' EINSETZEN DER STEUERZEICHEN FÜR DIE SEITENLÄNGE
  2216.   pos%=INSTR(seitenlaenge$,CHR$(255))  ! CHR 255 wird durch STRING abstand_von_links ersetzt
  2217.   IF pos%>0  ! D.h. Steuercode enthält CHR$(255)
  2218.     PRINT #0;LEFT$(seitenlaenge$,pos%-1);mb_seitenlaenge%;MID$(seitenlaenge$,pos%+1);
  2219.   ENDIF
  2220.   pos%=INSTR(seitenlaenge$,CHR$(254))  ! CHR 254 wird durch CHR$(abstand_von_links) ersetzt
  2221.   IF pos%>0  ! D.h. Steuercode enthält CHR$(254)
  2222.     PRINT #0;LEFT$(seitenlaenge$,pos%-1);CHR$(mb_seitenlaenge%);MID$(linkerrand$,pos%+1);
  2223.   ENDIF
  2224.   '
  2225.   ' EINSETZEN DER STEUERZEICHEN DEN LINKEN RAND
  2226.   IF INSTR(linkerrand$,CHR$(255))>0  ! CHR 255 wird durch abstand_von_links ersetzt
  2227.     pos%=INSTR(linkerrand$,CHR$(255))  ! CHR 255 wird durch abstand_von_links ersetzt
  2228.     PRINT #0;LEFT$(linkerrand$,pos%-1);mb_abstand_von_links%;MID$(linkerrand$,pos%+1);
  2229.   ELSE IF INSTR(linkerrand$,CHR$(254))>0  ! CHR 254 wird durch chr$(abstand_von_links) ersetzt
  2230.     pos%=INSTR(linkerrand$,CHR$(254))  ! CHR 254 wird durch chr$(abstand_von_links) ersetzt
  2231.     PRINT #0;LEFT$(linkerrand$,pos%-1);CHR$(mb_abstand_von_links%);MID$(linkerrand$,pos%+1);
  2232.   ELSE  ! linker Abstand hat feste Steuersequenz
  2233.     PRINT #0;linkerrand$;
  2234.   ENDIF
  2235.   '
  2236.   ' RAND
  2237.   FOR i%=1 TO mb_abstand_von_oben%
  2238.     PRINT #0
  2239.   NEXT i%
  2240.   GOSUB ausgabeumwandlung(ausgabe$,ausgabe$)
  2241.   PRINT #0;ausgabe$;
  2242.   PRINT #0;formfeed$;nachspann$; ! Auswurf des letzten Blattes ohne CR/LF
  2243. vb_druckende:
  2244.   @mausform(0)
  2245.   @druckerladen(1)  ! Standarddrucker laden
  2246. RETURN
  2247. ' **************************************************
  2248. '
  2249. ' Computer-Mahnbescheid
  2250. ' -----------------------
  2251. ' ************************************************
  2252. > PROCEDURE computer_mb(cmb_flag%)
  2253.   ' cmb_flag%=1 bei normalem CMB, der gedruckt werden soll
  2254.   ' cmb_flag%=2 bei zu speicherndem Muster-CMB
  2255.   ' cmb_flag%=3 bei anlegen des Standard-CMB
  2256.   mbauswahlbaum_adr%=rsc_adr%(mbauswahlbaum&)
  2257.   @dialog_positionieren(mbauswahlbaum&)
  2258.   '
  2259.   ' Nicht benötigte Objekte disablen
  2260.   @do_objc(mbauswahlbaum_adr%,mbaaktaufst&,&H8)  ! immer disablen, da Übernahme bei CMB zu umständlich
  2261.   IF @selected(mbauswahlbaum_adr%,mbaaktaufst&)=TRUE  ! dann deselektieren, da nicht anwählbar
  2262.     @select(mbauswahlbaum_adr%,mbastandard&,TRUE)
  2263.     @select(mbauswahlbaum_adr%,mbaaktaufst&,FALSE)
  2264.   ENDIF
  2265.   IF cmb_flag%=1 ! MB erstellen + dann drucken
  2266.     @select(mbauswahlbaum_adr%,mbambplus367&,TRUE)  ! Voreinstellung: zugleich Datei anlegen
  2267.     @select(mbauswahlbaum_adr%,mbadazubuchen&,FALSE)  ! andere deselektieren
  2268.     @select(mbauswahlbaum_adr%,mbanichtbuchen&,FALSE)  ! andere deselektieren
  2269.   ELSE ! MB-Muster sichern oder Standard-MB anlegen
  2270.     FOR i%=mbambplus367&-1 TO mbanichtbuchen&
  2271.       @do_objc(mbauswahlbaum_adr%,i%,&H8) ! helle Darstellung
  2272.     NEXT i%
  2273.   ENDIF
  2274.   '
  2275.   @rsc_draw(mbauswahlbaum&,fensterdial%)
  2276.   ex_obj%=@rsc_do(mbauswahlbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  2277.   @rsc_back(mbauswahlbaum&)
  2278.   @select(mbauswahlbaum_adr%,ex_obj%,FALSE)
  2279.   '
  2280.   ' Rücksetzen der deselektierten Objekte
  2281.   @undo_objc(mbauswahlbaum_adr%,mbaaktaufst&,&H8)  ! schwarze Darstellung
  2282.   FOR i%=mbambplus367&-1 TO mbanichtbuchen&
  2283.     @undo_objc(mbauswahlbaum_adr%,i%,&H8) ! Schwarze Darstellung
  2284.   NEXT i%
  2285.   '
  2286.   ' Auswertung
  2287.   IF ex_obj%=mbaok&
  2288.     IF @selected(mbauswahlbaum_adr%,mbastandard&)=TRUE
  2289.       @cmb_muster_laden(FALSE)  ! FALSE: Datei STANDARD.CMB laden
  2290.     ELSE IF @selected(mbauswahlbaum_adr%,mbaladen&)=TRUE
  2291.       @cmb_muster_laden(TRUE)  ! TRUE: mit Fileselectbox
  2292.     ELSE IF @selected(mbauswahlbaum_adr%,mbanichtaendern&)=TRUE
  2293.       ' nichts machen damit z.B. nochmal gedruckt werden kann
  2294.     ENDIF
  2295.   ELSE
  2296.     abbruch%=TRUE
  2297.   ENDIF
  2298.   IF abbruch%=TRUE  ! kann auch von cmb_muster_laden gesetzt worden sein
  2299.     GOTO cmb_ende
  2300.   ENDIF
  2301.   '
  2302.   IF @selected(mbauswahlbaum_adr%,mbambplus367&)=TRUE AND cmb_flag%=1 ! neue 367-Datei anlegen
  2303.     IF aufstellungsaenderung#=TRUE  ! Andernfalls ist sie eh schon gesichert
  2304.       IF @rsc_alert(1,"Aktuelle Forderungsberechnung|wird gelöscht. Bitte|vorher speichern.","[Speichern|[Weiter",1)=1
  2305.         GOSUB diskspeichern
  2306.       ENDIF
  2307.     ENDIF
  2308.     ' Aktenzeichen und Falldaten erfragen
  2309.     GOSUB az(az$)
  2310.     IF abbruch%=TRUE
  2311.       GOTO cmb_ende  ! durchschleifen
  2312.     ENDIF
  2313.     GOSUB falleingaben
  2314.     IF abbruch%=TRUE
  2315.       GOTO cmb_ende  ! durchschleifen
  2316.     ENDIF
  2317.   ENDIF
  2318.   @cmb_antragstellereingabe
  2319.   IF abbruch%=TRUE
  2320.     GOTO cmb_ende  ! durchschleifen
  2321.   ENDIF
  2322.   @cmb_antragsgegnereingabe
  2323.   IF abbruch%=TRUE
  2324.     GOTO cmb_ende  ! durchschleifen
  2325.   ENDIF
  2326.   @cmb_forderungseingabe
  2327.   IF abbruch%=TRUE
  2328.     GOTO cmb_ende  ! durchschleifen
  2329.   ENDIF
  2330.   @cmb_zusatzeingabe
  2331.   IF abbruch%=TRUE
  2332.     GOTO cmb_ende  ! durchschleifen
  2333.   ENDIF
  2334.   IF cmb_flag%=1  ! CMB drucken
  2335.     @cmb_druck
  2336.     ' je nach Anwahl bei MB-Voreinstellungen 367-Datei anlegen, ergänzen, oder lassen
  2337.     IF @selected(mbauswahlbaum_adr%,mbambplus367&)=TRUE  ! 367-Datei neu anlegen
  2338.       dateiname$=""  ! Für Voreinstellungen bei diskladen bzw speichern
  2339.       ' Felder löschen
  2340.       ARRAYFILL fdgdatum%(),0
  2341.       ARRAYFILL zinsdatum%(),0
  2342.       ARRAYFILL betrag#(),0
  2343.       ARRAYFILL restbetrag#(),0
  2344.       ARRAYFILL zinssatz#(),0
  2345.       ARRAYFILL fdgart#(),0
  2346.       FOR i%=0 TO maximalbuchungen%
  2347.         fdgtxt$(i%)=""
  2348.         fdgname$(i%)=""
  2349.       NEXT i%
  2350.       ' FELDER SIND LEER
  2351.       @cmb_dazubuchen
  2352.     ELSE IF @selected(mbauswahlbaum_adr%,mbanichtbuchen&)=TRUE
  2353.       ' nichts machen
  2354.     ELSE IF @selected(mbauswahlbaum_adr%,mbadazubuchen&)=TRUE  ! 367-Datei erweitern
  2355.       @cmb_dazubuchen
  2356.     ENDIF
  2357.     GOSUB neuberechnung(1)
  2358.     GOSUB forderungstextfeld
  2359.   ELSE IF cmb_flag%=2  ! Muster-CMB sichern
  2360.     @cmb_muster_speichern(TRUE)
  2361.   ELSE IF cmb_flag%=3  ! Standard-CMB sichern
  2362.     @cmb_muster_speichern(FALSE)
  2363.   ENDIF
  2364.   @redraw_part(0,0)
  2365.   '
  2366. cmb_ende:
  2367. RETURN
  2368. ' ***************************************************
  2369. > PROCEDURE cmb_antragstellereingabe
  2370.   LOCAL ex_obj%  ! Da andere Dialoge aus diesem heraus aufgerufen werden können
  2371.   cmbantragstlbaum_adr%=rsc_adr%(cmbantragstlbaum&)
  2372.   @dialog_positionieren(cmbantragstlbaum&)
  2373.   '
  2374.   ' Voreinstellung der Popups  (die Stingvariablen sind nur die Zahl ohne Text)
  2375.   @rsc_write_popup(cmbantragstlbaum&,caanredepopup1&,VAL(caanrede1$)+1)
  2376.   @rsc_write_popup(cmbantragstlbaum&,caanredepopup2&,VAL(caanrede2$)+1)
  2377.   @rsc_write_popup(cmbantragstlbaum&,cafirmenpopup&,MAX(VAL(cafirmenrechtsform$)-1,1))
  2378.   '
  2379.   ' Voreinstellung der Textfelder
  2380.   ' Aktenzeichen
  2381.   IF caaz$<>""  ! ein evtl. geladenes AZ
  2382.     CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caaz&)}}=caaz$
  2383.   ELSE  ! dann das normale, eingegebene AZ nehmen
  2384.     CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caaz&)}}=LEFT$(az$,36)
  2385.   ENDIF
  2386.   ' Antragsteller 1
  2387.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caauslkz1&)}}=caauslkz1$
  2388.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cavorname1&)}}=cavorname1$
  2389.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,canachname1&)}}=canachname1$
  2390.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,castrasse1&)}}=castrasse1$
  2391.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caplz1&)}}=caplz1$
  2392.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caort1&)}}=caort1$
  2393.   '
  2394.   ' Antragsteller 2
  2395.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caauslkz2&)}}=caauslkz2$
  2396.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cavorname2&)}}=cavorname2$
  2397.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,canachname2&)}}=canachname2$
  2398.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,castrasse2&)}}=castrasse2$
  2399.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caplz2&)}}=caplz2$
  2400.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caort2&)}}=caort2$
  2401.   '
  2402.   ' Antragstellerfirma
  2403.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,casonstigefirma&)}}=casonstigefirma$
  2404.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenname1&)}}=cafirmenname1$
  2405.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenname2&)}}=cafirmenname2$
  2406.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmaauslkz&)}}=cafirmaauslkz$
  2407.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenstrasse&)}}=cafirmenstrasse$
  2408.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenplz&)}}=cafirmenplz$
  2409.   CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenort&)}}=cafirmenort$
  2410.   '
  2411.   ' Vorbereitung des Dialogs
  2412.   @rsc_draw(cmbantragstlbaum&,fensterdial%)
  2413.   erstes_objekt%=0
  2414.   DO
  2415.     ex_obj%=@rsc_do(cmbantragstlbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  2416.     SELECT ex_obj%
  2417.     CASE cagesetzvertr&  ! Gesetzl. Vetreter eingeben
  2418.       @cmb_vertretereingabe(TRUE)
  2419.       @select(cmbantragstlbaum_adr%,cagesetzvertr&,FALSE)
  2420.       @objc_update(cmbantragstlbaum_adr%,cagesetzvertr&)
  2421.     CASE caprozessbevollm&
  2422.       @cmb_prozessbevollmaechtigteneingabe
  2423.       @select(cmbantragstlbaum_adr%,caprozessbevollm&,FALSE)
  2424.       @objc_update(cmbantragstlbaum_adr%,caprozessbevollm&)
  2425.     CASE cauebernahme1&  ! zum 1. Antragsteller
  2426.       ' Antragsteller 1 aus Fdgberechnung übernehmen (MIN wg. Feldlängen)
  2427.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cavorname1&)}}=LEFT$(glaeubigeranrede1$,MIN(36,INSTR(glaeubigeranrede1$," ")))
  2428.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,canachname1&)}}=MID$(glaeubigeranrede1$,INSTR(glaeubigeranrede1$," ")+1,36)
  2429.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,castrasse1&)}}=LEFT$(glaeubigerstrasse$,36)
  2430.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caplz1&)}}=LEFT$(glaeubigerort$,5)
  2431.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caort1&)}}=MID$(glaeubigerort$,INSTR(glaeubigerort$," ")+1,30)
  2432.       @objc_update(cmbantragstlbaum_adr%,cavorname1&)
  2433.       @objc_update(cmbantragstlbaum_adr%,canachname1&)
  2434.       @objc_update(cmbantragstlbaum_adr%,castrasse1&)
  2435.       @objc_update(cmbantragstlbaum_adr%,caplz1&)
  2436.       @objc_update(cmbantragstlbaum_adr%,caort1&)
  2437.     CASE cauebernahme2&  ! zum 2. Antragsteller
  2438.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cavorname2&)}}=LEFT$(glaeubigeranrede1$,MIN(36,INSTR(glaeubigeranrede1$," ")))
  2439.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,canachname2&)}}=MID$(glaeubigeranrede1$,INSTR(glaeubigeranrede1$," ")+1,36)
  2440.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,castrasse2&)}}=LEFT$(glaeubigerstrasse$,36)
  2441.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caplz2&)}}=LEFT$(glaeubigerort$,5)
  2442.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caort2&)}}=MID$(glaeubigerort$,INSTR(glaeubigerort$," ")+1,30)
  2443.       @objc_update(cmbantragstlbaum_adr%,cavorname2&)
  2444.       @objc_update(cmbantragstlbaum_adr%,canachname2&)
  2445.       @objc_update(cmbantragstlbaum_adr%,castrasse2&)
  2446.       @objc_update(cmbantragstlbaum_adr%,caplz2&)
  2447.       @objc_update(cmbantragstlbaum_adr%,caort2&)
  2448.     CASE cauebernahme3&  ! zur Antragstellerfirma
  2449.       ' Antragstellerfirma
  2450.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenname1&)}}=LEFT$(glaeubigeranrede1$,65)
  2451.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenstrasse&)}}=LEFT$(glaeubigerstrasse$,36)
  2452.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenplz&)}}=LEFT$(glaeubigerort$,5)
  2453.       CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenort&)}}=MID$(glaeubigerort$,INSTR(glaeubigerort$," "),30)
  2454.       @objc_update(cmbantragstlbaum_adr%,cafirmenname1&)
  2455.       @objc_update(cmbantragstlbaum_adr%,cafirmenstrasse&)
  2456.       @objc_update(cmbantragstlbaum_adr%,cafirmenplz&)
  2457.       @objc_update(cmbantragstlbaum_adr%,cafirmenort&)
  2458.     ENDSELECT
  2459.     EXIT IF ex_obj%=caok& OR ex_obj%=caabbruch&
  2460.   LOOP
  2461.   '
  2462.   ' Beenden des Dialogs
  2463.   @rsc_back(cmbantragstlbaum&)
  2464.   @select(cmbantragstlbaum_adr%,ex_obj%,FALSE)
  2465.   ' Dialog beendet
  2466.   '
  2467.   ' Auslesen der Eingaben wenn OK angeklickt
  2468.   IF ex_obj%=caok&
  2469.     ' Aktenzeichen
  2470.     caaz$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caaz&)}}
  2471.     ' Antragsteller 1
  2472.     caanrede1$=STR$(@rsc_read_popup(cmbantragstlbaum&,caanredepopup1&)-1)
  2473.     caauslkz1$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caauslkz1&)}}
  2474.     cavorname1$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cavorname1&)}}
  2475.     canachname1$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,canachname1&)}}
  2476.     castrasse1$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,castrasse1&)}}
  2477.     caplz1$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caplz1&)}}
  2478.     caort1$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caort1&)}}
  2479.     '
  2480.     ' Antragsteller 2
  2481.     caanrede2$=STR$(@rsc_read_popup(cmbantragstlbaum&,caanredepopup2&)-1)
  2482.     caauslkz2$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caauslkz2&)}}
  2483.     cavorname2$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cavorname2&)}}
  2484.     canachname2$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,canachname2&)}}
  2485.     castrasse2$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,castrasse2&)}}
  2486.     caplz2$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caplz2&)}}
  2487.     caort2$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,caort2&)}}
  2488.     '
  2489.     ' Antragstellerfirma
  2490.     cafirmenrechtsform$=STR$(@rsc_read_popup(cmbantragstlbaum&,cafirmenpopup&)+1)
  2491.     casonstigefirma$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,casonstigefirma&)}}
  2492.     cafirmenname1$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenname1&)}}
  2493.     cafirmenname2$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenname2&)}}
  2494.     cafirmaauslkz$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmaauslkz&)}}
  2495.     cafirmenstrasse$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenstrasse&)}}
  2496.     cafirmenplz$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenplz&)}}
  2497.     cafirmenort$=CHAR{{OB_SPEC(cmbantragstlbaum_adr%,cafirmenort&)}}
  2498.   ELSE  ! Abbruch angeklickt
  2499.     abbruch%=TRUE ! Globalvariable zum Durchschleifen der Prozeduren
  2500.   ENDIF
  2501.   '
  2502. RETURN
  2503. ' ***************************************************
  2504. > PROCEDURE cmb_antragsgegnereingabe
  2505.   LOCAL ex_obj%  ! Da andere Dialoge aus diesem heraus aufgerufen werden können
  2506.   cmbantragsggbaum_adr%=rsc_adr%(cmbantragsggbaum&)
  2507.   @dialog_positionieren(cmbantragsggbaum&)
  2508.   '
  2509.   ' Voreinstellung der Popups  (die Stingvariablen sind nur die Zahl ohne Text)
  2510.   @rsc_write_popup(cmbantragsggbaum&,cganredepopup1&,VAL(cganrede1$)+1)
  2511.   @rsc_write_popup(cmbantragsggbaum&,cganredepopup2&,VAL(cganrede2$)+1)
  2512.   @rsc_write_popup(cmbantragsggbaum&,cgfirmenpopup&,MAX(VAL(cgfirmenrechtsform$)-1,1))
  2513.   '
  2514.   ' Voreinstellung der Textfelder
  2515.   ' Antragsgegner 1
  2516.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgvorname1&)}}=cgvorname1$
  2517.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgnachname1&)}}=cgnachname1$
  2518.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgstrasse1&)}}=cgstrasse1$
  2519.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgplz1&)}}=cgplz1$
  2520.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgort1&)}}=cgort1$
  2521.   '
  2522.   ' Antragsgegner 2
  2523.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgvorname2&)}}=cgvorname2$
  2524.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgnachname2&)}}=cgnachname2$
  2525.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgstrasse2&)}}=cgstrasse2$
  2526.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgplz2&)}}=cgplz2$
  2527.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgort2&)}}=cgort2$
  2528.   '
  2529.   ' Antragsgegnerfirma
  2530.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgsonstigefirma&)}}=cgsonstigefirma$
  2531.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenname1&)}}=cgfirmenname1$
  2532.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenname2&)}}=cgfirmenname2$
  2533.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenstrasse&)}}=cgfirmenstrasse$
  2534.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenplz&)}}=cgfirmenplz$
  2535.   CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenort&)}}=cgfirmenort$
  2536.   '
  2537.   ' Gesamtschuldnercheckbox
  2538.   IF cggesamtschuld$="X"
  2539.     @select(cmbantragsggbaum_adr%,cggesamtschuld&,TRUE)
  2540.   ELSE
  2541.     @select(cmbantragsggbaum_adr%,cggesamtschuld&,FALSE)
  2542.   ENDIF
  2543.   '
  2544.   ' Vorbereitung des Dialogs
  2545.   @rsc_draw(cmbantragsggbaum&,fensterdial%)
  2546.   erstes_objekt%=0
  2547.   DO
  2548.     ex_obj%=@rsc_do(cmbantragsggbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  2549.     SELECT ex_obj%
  2550.     CASE cggesetzvertr&  ! Gesetzl. Vetreter eingeben
  2551.       @cmb_vertretereingabe(FALSE)
  2552.       @select(cmbantragsggbaum_adr%,cggesetzvertr&,FALSE)
  2553.       @objc_update(cmbantragsggbaum_adr%,cggesetzvertr&)
  2554.     CASE cguebernahme1&  ! zum 1. Antragsteller
  2555.       ' Antragsteller 1 aus Fdgberechnung übernehmen
  2556.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgvorname1&)}}=LEFT$(schuldneranrede1$,MIN(36,INSTR(schuldneranrede1$," ")))
  2557.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgnachname1&)}}=MID$(schuldneranrede1$,INSTR(schuldneranrede1$," ")+1,36)
  2558.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgstrasse1&)}}=LEFT$(schuldnerstrasse$,36)
  2559.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgplz1&)}}=LEFT$(schuldnerort$,5)
  2560.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgort1&)}}=MID$(schuldnerort$,INSTR(schuldnerort$," ")+1,30)
  2561.       @objc_update(cmbantragsggbaum_adr%,cgvorname1&)
  2562.       @objc_update(cmbantragsggbaum_adr%,cgnachname1&)
  2563.       @objc_update(cmbantragsggbaum_adr%,cgstrasse1&)
  2564.       @objc_update(cmbantragsggbaum_adr%,cgplz1&)
  2565.       @objc_update(cmbantragsggbaum_adr%,cgort1&)
  2566.     CASE cguebernahme2&  ! zum 2. Antragsteller
  2567.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgvorname2&)}}=LEFT$(schuldneranrede1$,MIN(36,INSTR(schuldneranrede1$," ")))
  2568.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgnachname2&)}}=MID$(schuldneranrede1$,INSTR(schuldneranrede1$," ")+1,36)
  2569.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgstrasse2&)}}=LEFT$(schuldnerstrasse$,36)
  2570.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgplz2&)}}=LEFT$(schuldnerort$,5)
  2571.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgort2&)}}=MID$(schuldnerort$,INSTR(schuldnerort$," ")+1,30)
  2572.       @objc_update(cmbantragsggbaum_adr%,cgvorname2&)
  2573.       @objc_update(cmbantragsggbaum_adr%,cgnachname2&)
  2574.       @objc_update(cmbantragsggbaum_adr%,cgstrasse2&)
  2575.       @objc_update(cmbantragsggbaum_adr%,cgplz2&)
  2576.       @objc_update(cmbantragsggbaum_adr%,cgort2&)
  2577.     CASE cguebernahme3&  ! zur Antragstellerfirma
  2578.       ' Antragstellerfirma
  2579.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenname1&)}}=LEFT$(schuldneranrede1$,65)
  2580.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenstrasse&)}}=LEFT$(schuldnerstrasse$,65)
  2581.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenplz&)}}=LEFT$(schuldnerort$,5)
  2582.       CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenort&)}}=MID$(schuldnerort$,INSTR(schuldnerort$," "),30)
  2583.       @objc_update(cmbantragsggbaum_adr%,cgfirmenname1&)
  2584.       @objc_update(cmbantragsggbaum_adr%,cgfirmenstrasse&)
  2585.       @objc_update(cmbantragsggbaum_adr%,cgfirmenplz&)
  2586.       @objc_update(cmbantragsggbaum_adr%,cgfirmenort&)
  2587.     ENDSELECT
  2588.     EXIT IF ex_obj%=cgok& OR ex_obj%=cgabbruch&
  2589.   LOOP
  2590.   '
  2591.   ' Beenden des Dialogs
  2592.   @rsc_back(cmbantragsggbaum&)
  2593.   @select(cmbantragsggbaum_adr%,ex_obj%,FALSE)
  2594.   ' Dialog beendet
  2595.   '
  2596.   ' Auslesen der Eingaben wenn OK angeklickt
  2597.   IF ex_obj%=cgok&
  2598.     '
  2599.     ' Gesamtschuldnerschaft ?
  2600.     IF @selected(cmbantragsggbaum_adr%,cgauslkz1&)=TRUE
  2601.       cggesamtschuldner$="X"
  2602.     ELSE
  2603.       cggesamtschuldner$=" "
  2604.     ENDIF
  2605.     '
  2606.     ' Antraggegner 1
  2607.     cganrede1$=STR$(@rsc_read_popup(cmbantragsggbaum&,cganredepopup1&)-1)
  2608.     cgvorname1$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgvorname1&)}}
  2609.     cgnachname1$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgnachname1&)}}
  2610.     cgstrasse1$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgstrasse1&)}}
  2611.     cgplz1$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgplz1&)}}
  2612.     cgort1$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgort1&)}}
  2613.     '
  2614.     ' Antraggegner 2
  2615.     cganrede2$=STR$(@rsc_read_popup(cmbantragsggbaum&,cganredepopup2&)-1)
  2616.     cgvorname2$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgvorname2&)}}
  2617.     cgnachname2$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgnachname2&)}}
  2618.     cgstrasse2$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgstrasse2&)}}
  2619.     cgplz2$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgplz2&)}}
  2620.     cgort2$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgort2&)}}
  2621.     '
  2622.     ' Antraggegnerfirma
  2623.     cgfirmenrechtsform$=STR$(@rsc_read_popup(cmbantragsggbaum&,cgfirmenpopup&)+1)
  2624.     cgsonstigefirma$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgsonstigefirma&)}}
  2625.     cgfirmenname1$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenname1&)}}
  2626.     cgfirmenname2$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenname2&)}}
  2627.     cgfirmenstrasse$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenstrasse&)}}
  2628.     cgfirmenplz$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenplz&)}}
  2629.     cgfirmenort$=CHAR{{OB_SPEC(cmbantragsggbaum_adr%,cgfirmenort&)}}
  2630.     '
  2631.     ' Gesamtschuldnercheckbox
  2632.     IF @selected(cmbantragsggbaum_adr%,cggesamtschuld&)=TRUE
  2633.       cggesamtschuld$="X"
  2634.     ELSE
  2635.       cggesamtschuld$=" "  ! Leerzeichen, da Länge für Ausdruck identisch sein muß
  2636.     ENDIF
  2637.   ELSE  ! Abbruch angeklickt
  2638.     abbruch%=TRUE ! Globalvariable zum Durchschleifen der Prozeduren
  2639.   ENDIF
  2640.   '
  2641. RETURN
  2642. ' ***************************************************
  2643. > PROCEDURE cmb_vertretereingabe(fl%)
  2644.   ' fl%=TRUE bei Antragstellervertreter, FALSE bei Antragsgegnervertreter
  2645.   cmbvertreterbaum_adr%=rsc_adr%(cmbvertreterbaum&)
  2646.   @dialog_positionieren(cmbvertreterbaum&)
  2647.   '
  2648.   IF fl%=TRUE  ! Antragstellervertreter
  2649.     ' Erster Vertreter
  2650.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvspalte1&)}}=casvspalte1$
  2651.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvauslkz1&)}}=casvauslkz1$
  2652.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstellung1&)}}=casvstellung1$
  2653.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvvornachname1&)}}=casvvornachname1$
  2654.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstrasse1&)}}=casvstrasse1$
  2655.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvplz1&)}}=casvplz1$
  2656.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvort1&)}}=casvort1$
  2657.     '
  2658.     ' zweiter Vertreter
  2659.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvspalte2&)}}=casvspalte2$
  2660.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvauslkz2&)}}=casvauslkz2$
  2661.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstellung2&)}}=casvstellung2$
  2662.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvvornachname2&)}}=casvvornachname2$
  2663.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstrasse2&)}}=casvstrasse2$
  2664.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvplz2&)}}=casvplz2$
  2665.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvort2&)}}=casvort2$
  2666.     '
  2667.   ELSE IF fl%=FALSE  ! Antragsgegnervertreter
  2668.     ' Erster Vertreter
  2669.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvspalte1&)}}=cagvspalte1$
  2670.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstellung1&)}}=cagvstellung1$
  2671.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvvornachname1&)}}=cagvvornachname1$
  2672.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstrasse1&)}}=cagvstrasse1$
  2673.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvplz1&)}}=cagvplz1$
  2674.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvort1&)}}=cagvort1$
  2675.     '
  2676.     ' zweiter Vertreter
  2677.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvspalte2&)}}=cagvspalte2$
  2678.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstellung2&)}}=cagvstellung2$
  2679.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvvornachname2&)}}=cagvvornachname2$
  2680.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstrasse2&)}}=cagvstrasse2$
  2681.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvplz2&)}}=cagvplz2$
  2682.     CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvort2&)}}=cagvort2$
  2683.     '
  2684.   ENDIF
  2685.   '
  2686.   ' Vorbereitung des Dialogs
  2687.   @rsc_draw(cmbvertreterbaum&,fensterdial%)
  2688.   erstes_objekt%=0
  2689.   ex_obj%=@rsc_do(cmbvertreterbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  2690.   '
  2691.   ' Beenden des Dialogs
  2692.   @rsc_back(cmbvertreterbaum&)
  2693.   @select(cmbvertreterbaum_adr%,ex_obj%,FALSE)
  2694.   ' Dialog beendet
  2695.   '
  2696.   IF ex_obj%=cvok& ! ==> Daten auslesen. Bei Abbruch nicht durchschleifen wg. 2 Box darunter
  2697.     IF fl%=TRUE  ! Antragstellervertreter
  2698.       ' Erster Vertreter
  2699.       casvspalte1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvspalte1&)}}
  2700.       casvauslkz1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvauslkz1&)}}
  2701.       casvstellung1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstellung1&)}}
  2702.       casvvornachname1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvvornachname1&)}}
  2703.       casvstrasse1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstrasse1&)}}
  2704.       casvplz1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvplz1&)}}
  2705.       casvort1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvort1&)}}
  2706.       '
  2707.       ' Zweiter Vertreter
  2708.       casvspalte2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvspalte2&)}}
  2709.       casvauslkz2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvauslkz2&)}}
  2710.       casvstellung2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstellung2&)}}
  2711.       casvvornachname2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvvornachname2&)}}
  2712.       casvstrasse2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstrasse2&)}}
  2713.       casvplz2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvplz2&)}}
  2714.       casvort2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvort2&)}}
  2715.     ELSE IF fl%=FALSE  !Antragsgegnervertreter
  2716.       ' Erster Vertreter
  2717.       cagvspalte1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvspalte1&)}}
  2718.       cagvstellung1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstellung1&)}}
  2719.       cagvvornachname1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvvornachname1&)}}
  2720.       cagvstrasse1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstrasse1&)}}
  2721.       cagvplz1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvplz1&)}}
  2722.       cagvort1$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvort1&)}}
  2723.       '
  2724.       ' Zweiter Vertreter
  2725.       cagvspalte2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvspalte2&)}}
  2726.       cagvstellung2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstellung2&)}}
  2727.       cagvvornachname2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvvornachname2&)}}
  2728.       cagvstrasse2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvstrasse2&)}}
  2729.       cagvplz2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvplz2&)}}
  2730.       cagvort2$=CHAR{{OB_SPEC(cmbvertreterbaum_adr%,cvort2&)}}
  2731.     ENDIF
  2732.   ENDIF
  2733. RETURN
  2734. ' ***************************************************
  2735. > PROCEDURE cmb_prozessbevollmaechtigteneingabe
  2736.   cmbprozbevbaum_adr%=rsc_adr%(cmbprozbevbaum&)
  2737.   @dialog_positionieren(cmbprozbevbaum&)
  2738.   '
  2739.   ' Popup einstellen
  2740.   @rsc_write_popup(cmbprozbevbaum&,cpanredepopup&,VAL(cpanrede$)+1)
  2741.   '
  2742.   ' Textfelder einstellen
  2743.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpauslagen&)}}=cpauslagen$
  2744.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpvornachname&)}}=cpvornachname$
  2745.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpauslkz&)}}=cpauslkz$
  2746.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpstrasse&)}}=cpstrasse$
  2747.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpplz&)}}=cpplz$
  2748.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cport&)}}=cport$
  2749.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpblz&)}}=cpblz$
  2750.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpkonto&)}}=cpkonto$
  2751.   CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpbank&)}}=cpbank$
  2752.   '
  2753.   ' Vorbereitung des Dialogs
  2754.   @rsc_draw(cmbprozbevbaum&,fensterdial%)
  2755.   DO
  2756.     ex_obj%=@rsc_do(cmbprozbevbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  2757.     SELECT ex_obj%
  2758.     CASE cpuebernahme&
  2759.       CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpvornachname&)}}=LEFT$(useranrede2$,65)
  2760.       ' Anm. Useranrede1$ ist i.d.R. der Titel (Rechtsanwälte), was hier das Popup ist
  2761.       CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpstrasse&)}}=LEFT$(userstr$,36)
  2762.       CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpplz&)}}=LEFT$(userort$,5)
  2763.       CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cport&)}}=MID$(userort$,INSTR(userort$," ")+1,30)
  2764.       CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpblz&)}}=LEFT$(userblz$,10)
  2765.       CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpkonto&)}}=LEFT$(userkto$,25)
  2766.       CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpbank&)}}=LEFT$(userbank$,36)
  2767.       @objc_update(cmbprozbevbaum_adr%,cpvornachname&)
  2768.       @objc_update(cmbprozbevbaum_adr%,cpstrasse&)
  2769.       @objc_update(cmbprozbevbaum_adr%,cpplz&)
  2770.       @objc_update(cmbprozbevbaum_adr%,cport&)
  2771.       @objc_update(cmbprozbevbaum_adr%,cpblz&)
  2772.       @objc_update(cmbprozbevbaum_adr%,cpkonto&)
  2773.       @objc_update(cmbprozbevbaum_adr%,cpbank&)
  2774.     ENDSELECT
  2775.   LOOP UNTIL ex_obj%=cpok& OR ex_obj%=cpabbruch&
  2776.   '
  2777.   ' Beenden des Dialogs
  2778.   @rsc_back(cmbprozbevbaum&)
  2779.   @select(cmbprozbevbaum_adr%,ex_obj%,FALSE)
  2780.   ' Dialog beendet
  2781.   '
  2782.   '
  2783.   IF ex_obj%=cpok&  ! dann Daten auslesen
  2784.     ' Popups abfragen
  2785.     cpanrede$=STR$(@rsc_read_popup(cmbprozbevbaum&,cpanredepopup&)-1)
  2786.     '
  2787.     ' Textfelder abfragen
  2788.     cpauslagen$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpauslagen&)}}
  2789.     cpvornachname$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpvornachname&)}}
  2790.     cpauslkz$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpauslkz&)}}
  2791.     cpstrasse$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpstrasse&)}}
  2792.     cpplz$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpplz&)}}
  2793.     cport$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cport&)}}
  2794.     cpblz$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpblz&)}}
  2795.     cpkonto$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpkonto&)}}
  2796.     cpbank$=CHAR{{OB_SPEC(cmbprozbevbaum_adr%,cpbank&)}}
  2797.   ELSE
  2798.     abbruch%=TRUE  ! zum Durchschleifen für andere Programme
  2799.   ENDIF
  2800.   '
  2801. RETURN
  2802. ' ***************************************************
  2803. > PROCEDURE cmb_forderungseingabe
  2804.   LOCAL ex_obj%  ! Da andere Dialoge aus diesem heraus aufgerufen werden können
  2805.   cmbforderungbaum_adr%=rsc_adr%(cmbforderungbaum&)
  2806.   @dialog_positionieren(cmbforderungbaum&)
  2807.   '
  2808.   ' Hauptforderungen
  2809.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr1&)}}=cfkatalognr1$
  2810.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechtsgrund1&)}}=cfrechtsgrund1$
  2811.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechnungsnr1&)}}=cfrechnungsnr1$
  2812.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum1&)}}=cfabdatum1$
  2813.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbisdatum1&)}}=cfbisdatum1$
  2814.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag1&)}}=cfbetrag1$
  2815.   ' --------------------------
  2816.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr2&)}}=cfkatalognr2$
  2817.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechtsgrund2&)}}=cfrechtsgrund2$
  2818.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechnungsnr2&)}}=cfrechnungsnr2$
  2819.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum2&)}}=cfabdatum2$
  2820.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbisdatum2&)}}=cfbisdatum2$
  2821.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag2&)}}=cfbetrag2$
  2822.   ' --------------------
  2823.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr3&)}}=cfkatalognr3$
  2824.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechtsgrund3&)}}=cfrechtsgrund3$
  2825.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechnungsnr3&)}}=cfrechnungsnr3$
  2826.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum3&)}}=cfabdatum3$
  2827.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbisdatum3&)}}=cfbisdatum3$
  2828.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag3&)}}=cfbetrag3$
  2829.   '
  2830.   ' sonstige Rechtsgründe
  2831.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfplz&)}}=cfplz$
  2832.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfort&)}}=cfort$
  2833.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfauslkz&)}}=cfauslkz$
  2834.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfvertragsart&)}}=cfvertragsart$
  2835.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstigeanspr1&)}}=cfsonstigeanspr1$
  2836.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstigeanspr2&)}}=cfsonstigeanspr2$
  2837.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstigebetrag&)}}=cfsonstigebetrag$
  2838.   '
  2839.   ' Zinsen-Popups
  2840.   '
  2841.   ' Voreinstellung der Popups  (die Stingvariablen sind nur die Zahl ohne Text)
  2842.   @rsc_write_popup(cmbforderungbaum&,cfzinsturnuspop1&,VAL(cfzinsturnus1$))
  2843.   @rsc_write_popup(cmbforderungbaum&,cfzinsturnuspop2&,VAL(cfzinsturnus2$))
  2844.   @rsc_write_popup(cmbforderungbaum&,cfzinsturnuspop3&,VAL(cfzinsturnus3$))
  2845.   '
  2846.   ' Zinsen-Textfelder
  2847.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinshfzeile1&)}}=cfzinshfzeile1$
  2848.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfnormalzins1&)}}=cfnormalzins1$
  2849.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfdiskontzins1&)}}=cfdiskontzins1$
  2850.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsbasis1&)}}=cfzinsbasis1$
  2851.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsstart1&)}}=cfzinsstart1$
  2852.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsende1&)}}=cfzinsende1$
  2853.   ' ------------------
  2854.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinshfzeile2&)}}=cfzinshfzeile2$
  2855.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfnormalzins2&)}}=cfnormalzins2$
  2856.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfdiskontzins2&)}}=cfdiskontzins2$
  2857.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsbasis2&)}}=cfzinsbasis2$
  2858.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsstart2&)}}=cfzinsstart2$
  2859.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsende2&)}}=cfzinsende2$
  2860.   ' --------------------
  2861.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinshfzeile3&)}}=cfzinshfzeile3$
  2862.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfnormalzins3&)}}=cfnormalzins3$
  2863.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfdiskontzins3&)}}=cfdiskontzins3$
  2864.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsbasis3&)}}=cfzinsbasis3$
  2865.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsstart3&)}}=cfzinsstart3$
  2866.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsende3&)}}=cfzinsende3$
  2867.   ' ---- ausgerechnete Zinsen -------
  2868.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfausgerzinsab&)}}=cfausgerzinsab$
  2869.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfausgerzinsbis&)}}=cfausgerzinsbis$
  2870.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfausgerzinsbetr&)}}=cfausgerzinsbetr$
  2871.   ' ------- Auslagen ------
  2872.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfauslagen&)}}=cfauslagen$
  2873.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstauslagenb&)}}=cfsonstauslagenb$
  2874.   CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstauslagenn&)}}=cfsonstauslagenn$
  2875.   '
  2876.   ' Vorbereitung des Dialogs
  2877.   @rsc_draw(cmbforderungbaum&,fensterdial%)
  2878.   erstes_objekt%=0
  2879. neu_cmbforderungseingabe:
  2880.   DO
  2881.     ex_obj%=@rsc_do(cmbforderungbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  2882.     IF ex_obj%=cfkatalognrhelp&
  2883.       @cmb_hfkatalog
  2884.       @select(cmbforderungbaum_adr%,cfkatalognrhelp&,FALSE)
  2885.       @objc_update(cmbforderungbaum_adr%,cfkatalognrhelp&)
  2886.     ENDIF
  2887.   LOOP UNTIL ex_obj%=cfok& OR ex_obj%=cfabbruch&
  2888.   IF ex_obj%=cfok&  ! Daten auslesen
  2889.     ' Hauptforderungen
  2890.     cfkatalognr1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr1&)}}
  2891.     cfrechtsgrund1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechtsgrund1&)}}
  2892.     cfrechnungsnr1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechnungsnr1&)}}
  2893.     cfabdatum1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum1&)}}
  2894.     cfbisdatum1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbisdatum1&)}}
  2895.     cfbetrag1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag1&)}}
  2896.     ' --------------------------
  2897.     cfkatalognr2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr2&)}}
  2898.     cfrechtsgrund2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechtsgrund2&)}}
  2899.     cfrechnungsnr2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechnungsnr2&)}}
  2900.     cfabdatum2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum2&)}}
  2901.     cfbisdatum2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbisdatum2&)}}
  2902.     cfbetrag2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag2&)}}
  2903.     ' --------------------
  2904.     cfkatalognr3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr3&)}}
  2905.     cfrechtsgrund3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechtsgrund3&)}}
  2906.     cfrechnungsnr3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfrechnungsnr3&)}}
  2907.     cfabdatum3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum3&)}}
  2908.     cfbisdatum3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbisdatum3&)}}
  2909.     cfbetrag3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag3&)}}
  2910.     '
  2911.     ' Änderung für Demoversion
  2912.     IF demoversion%=TRUE
  2913.       IF VAL(cfbetrag1$)+VAL(cfbetrag2$)+VAL(cfbetrag3$)>1000
  2914.         dummy%=@rsc_alert(1,"Geld_her! 3.0 Demoversion|CMBs nur bis DM 1000.-|Daher kein Ausdruck."," [OK ",1)
  2915.         abbruch%=TRUE
  2916.         druckabbruch%=TRUE
  2917.       ENDIF
  2918.     ENDIF
  2919.     '
  2920.     ' sonstige Rechtsgründe
  2921.     cfplz$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfplz&)}}
  2922.     cfort$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfort&)}}
  2923.     cfauslkz$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfauslkz&)}}
  2924.     cfvertragsart$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfvertragsart&)}}
  2925.     cfsonstigeanspr1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstigeanspr1&)}}
  2926.     cfsonstigeanspr2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstigeanspr2&)}}
  2927.     cfsonstigebetrag$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstigebetrag&)}}
  2928.     '
  2929.     ' Zinsen-Popups
  2930.     cfzinsturnus1$=STR$(@rsc_read_popup(cmbforderungbaum&,cfzinsturnuspop1&))
  2931.     cfzinsturnus2$=STR$(@rsc_read_popup(cmbforderungbaum&,cfzinsturnuspop2&))
  2932.     cfzinsturnus3$=STR$(@rsc_read_popup(cmbforderungbaum&,cfzinsturnuspop3&))
  2933.     '
  2934.     ' Zinsen-Textfelder
  2935.     cfzinshfzeile1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinshfzeile1&)}}
  2936.     cfnormalzins1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfnormalzins1&)}}
  2937.     cfdiskontzins1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfdiskontzins1&)}}
  2938.     cfzinsbasis1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsbasis1&)}}
  2939.     cfzinsstart1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsstart1&)}}
  2940.     cfzinsende1$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsende1&)}}
  2941.     ' ------------------
  2942.     cfzinshfzeile2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinshfzeile2&)}}
  2943.     cfnormalzins2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfnormalzins2&)}}
  2944.     cfdiskontzins2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfdiskontzins2&)}}
  2945.     cfzinsbasis2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsbasis2&)}}
  2946.     cfzinsstart2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsstart2&)}}
  2947.     cfzinsende2$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsende2&)}}
  2948.     ' --------------------
  2949.     cfzinshfzeile3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinshfzeile3&)}}
  2950.     cfnormalzins3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfnormalzins3&)}}
  2951.     cfdiskontzins3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfdiskontzins3&)}}
  2952.     cfzinsbasis3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsbasis3&)}}
  2953.     cfzinsstart3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsstart3&)}}
  2954.     cfzinsende3$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfzinsende3&)}}
  2955.     ' ---- ausgerechnete Zinsen -------
  2956.     cfausgerzinsab$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfausgerzinsab&)}}
  2957.     cfausgerzinsbis$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfausgerzinsbis&)}}
  2958.     cfausgerzinsbetr$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfausgerzinsbetr&)}}
  2959.     ' ------- Auslagen ------
  2960.     cfauslagen$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfauslagen&)}}
  2961.     cfsonstauslagenb$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstauslagenb&)}}
  2962.     cfsonstauslagenn$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstauslagenn&)}}
  2963.     '
  2964.     IF cmb_flag%=1   ! bei normalem CMB, der gedruckt werden soll
  2965.       @cmb_logikkontrolle(erstes_objekt%,error%)
  2966.       IF error%=TRUE
  2967.         @select(cmbforderungbaum_adr%,ex_obj%,FALSE)
  2968.         @objc_update(cmbforderungbaum_adr%,ex_obj%)  ! Wegen Rücksprung Logikkontrolle
  2969.         GOTO neu_cmbforderungseingabe
  2970.       ENDIF
  2971.     ENDIF
  2972.   ELSE
  2973.     abbruch%=TRUE
  2974.   ENDIF
  2975.   '
  2976.   ' Beenden des Dialogs
  2977.   @rsc_back(cmbforderungbaum&)
  2978.   @select(cmbforderungbaum_adr%,ex_obj%,FALSE)
  2979.   ' Dialog beendet
  2980.   '
  2981. RETURN
  2982. ' *******************************************************
  2983. > PROCEDURE cmb_logikkontrolle(VAR erstes_objekt%,error%)
  2984.   ' ================
  2985.   ' Logikkontrolle für Forderungseingaben
  2986.   ' ================
  2987.   error%=FALSE
  2988.   ' 1. HF-Zeilen: Wenn überhaupt, muß mindestens Katnr, Rgdatum und Betrag eingegeben sein
  2989.   IF LEN(cfkatalognr1$)*LEN(cfabdatum1$)*LEN(cfbetrag1$)=0 AND MAX(LEN(cfkatalognr1$),LEN(cfabdatum1$),LEN(cfbetrag1$))>0! irgendwo keine Eingabe ==>Müll
  2990.     ~@rsc_alert(1,"Unsinnige Eingaben in|Zeile 32 ! Geben Sie|mindestens Katalognr.,|Rechnungsdatum und|Betrag ein."," [OK ",1)
  2991.     erstes_objekt%=cfkatalognr1&
  2992.     error%=TRUE
  2993.   ELSE IF LEN(cfkatalognr2$)*LEN(cfabdatum2$)*LEN(cfbetrag2$)=0 AND MAX(LEN(cfkatalognr2$),LEN(cfabdatum2$),LEN(cfbetrag2$))>0! irgendwo keine Eingabe ==>Müll
  2994.     ~@rsc_alert(1,"Unsinnige Eingaben in|Zeile 33 ! Geben Sie|mindestens Katalognr.,|Rechnungsdatum und|Betrag ein."," [OK ",1)
  2995.     erstes_objekt%=cfkatalognr2&
  2996.     error%=TRUE
  2997.   ELSE IF LEN(cfkatalognr3$)*LEN(cfabdatum3$)*LEN(cfbetrag3$)=0 AND MAX(LEN(cfkatalognr3$),LEN(cfabdatum3$),LEN(cfbetrag3$))>0! irgendwo keine Eingabe ==>Müll
  2998.     ~@rsc_alert(1,"Unsinnige Eingaben in|Zeile 34 ! Geben Sie|mindestens Katalognr.,|Rechnungsdatum und|Betrag ein."," [OK ",1)
  2999.     erstes_objekt%=cfkatalognr3&
  3000.     error%=TRUE
  3001.   ENDIF
  3002.   ' Es gibt nur Forderungsart 1-46 und 90
  3003.   IF cfkatalognr1$<>"" AND VAL(cfkatalognr1$)>46 AND VAL(cfkatalognr1$)<>90
  3004.     ~@rsc_alert(1,"Es gibt nur Katalognummer|1 bis 46 und 90. Alles|andere bitte unter|'sonstigem Rechtsgrund'|eintragen."," [OK ",1)
  3005.     erstes_objekt%=cfkatalognr1&
  3006.     error%=TRUE
  3007.   ELSE IF cfkatalognr2$<>"" AND VAL(cfkatalognr2$)>46 AND VAL(cfkatalognr2$)<>90
  3008.     ~@rsc_alert(1,"Es gibt nur Katalognummer|1 bis 46 und 90. Alles|andere bitte unter|'sonstigem Rechtsgrund'|eintragen."," [OK ",1)
  3009.     erstes_objekt%=cfkatalognr2&
  3010.     error%=TRUE
  3011.   ELSE IF cfkatalognr3$<>"" AND VAL(cfkatalognr3$)>46 AND VAL(cfkatalognr3$)<>90
  3012.     ~@rsc_alert(1,"Es gibt nur Katalognummer|1 bis 46 und 90. Alles|andere bitte unter|'sonstigem Rechtsgrund'|eintragen."," [OK ",1)
  3013.     erstes_objekt%=cfkatalognr3&
  3014.     error%=TRUE
  3015.   ENDIF
  3016.   '
  3017.   ' 2. Zusatzeingaben zu manchen Katalognummern vorgeschrieben
  3018.   ' Katalognr. 28
  3019.   IF VAL(TRIM$(cfkatalognr1$))=28 OR VAL(TRIM$(cfkatalognr2$))=28 OR VAL(TRIM$(cfkatalognr3$))=28 AND cfvertragsart$=""
  3020.     ~@rsc_alert(1,"Für Katalognr. 28|ist Angabe der Vertrags-|art erforderlich !"," [OK ",1)
  3021.     erstes_objekt%=cfvertragsart&
  3022.     error%=TRUE
  3023.   ENDIF
  3024.   ' Katalognr. 19,20,90
  3025.   IF VAL(cfkatalognr1$)=19 OR VAL(cfkatalognr2$)=19 OR VAL(cfkatalognr3$)=19 AND cfvertragsart$=""
  3026.     ~@rsc_alert(1,"Für Katalognr. 19|ist Angabe des Ortes|erforderlich !"," [OK ",1)
  3027.     erstes_objekt%=cfplz&
  3028.     error%=TRUE
  3029.   ELSE IF VAL(cfkatalognr1$)=20 OR VAL(cfkatalognr2$)=20 OR VAL(cfkatalognr3$)=20 AND cfvertragsart$=""
  3030.     ~@rsc_alert(1,"Für Katalognr. 20|ist Angabe des Ortes|erforderlich !"," [OK ",1)
  3031.     erstes_objekt%=cfplz&
  3032.     error%=TRUE
  3033.   ELSE IF VAL(cfkatalognr1$)=90 OR VAL(cfkatalognr2$)=90 OR VAL(cfkatalognr3$)=90 AND cfvertragsart$=""
  3034.     ~@rsc_alert(1,"Für Katalognr. 90|ist Angabe des Ortes|erforderlich !"," [OK ",1)
  3035.     erstes_objekt%=cfplz&
  3036.     error%=TRUE
  3037.   ENDIF
  3038.   '
  3039.   ' 3. Sonstige Anspruchsgründe
  3040.   IF cfsonstigeanspr1$<>"" OR cfsonstigeanspr2$<>"" XOR cfsonstigebetrag$<>""
  3041.     ~@rsc_alert(1,"Für sonstige Ansprüche|bitte Betrag _und_|Bezeichnung angeben !"," [OK ",1)
  3042.     erstes_objekt%=cfsonstigeanspr1&
  3043.     error%=TRUE
  3044.   ENDIF
  3045.   '
  3046.   ' 4. Zinsen überprüfen
  3047.   ' a) gibts die bezogene Zeile überhaupt ?
  3048.   IF VAL(cfzinshfzeile1$)>0 AND VAL(cfzinshfzeile1$)<32 OR VAL(cfzinshfzeile1$)>34
  3049.     ~@rsc_alert(1,"Zinsen können nur|auf die Zeilen 32-34|bezogen werden !"," [OK ",1)
  3050.     erstes_objekt%=cfzinshfzeile1&
  3051.     error%=TRUE
  3052.   ELSE IF VAL(cfzinshfzeile2$)>0 AND VAL(cfzinshfzeile2$)<32 OR VAL(cfzinshfzeile2$)>34
  3053.     ~@rsc_alert(1,"Zinsen können nur|auf die Zeilen 32-34|bezogen werden !"," [OK ",1)
  3054.     erstes_objekt%=cfzinshfzeile2&
  3055.     error%=TRUE
  3056.   ELSE IF VAL(cfzinshfzeile3$)>0 AND VAL(cfzinshfzeile3$)<32 OR VAL(cfzinshfzeile3$)>34
  3057.     ~@rsc_alert(1,"Zinsen können nur|auf die Zeilen 32-34|bezogen werden !"," [OK ",1)
  3058.     erstes_objekt%=cfzinshfzeile3&
  3059.     error%=TRUE
  3060.   ENDIF
  3061.   '
  3062.   ' b) ist die bezogene Zeile überhaupt belegt ?
  3063.   a%=VAL(cfzinshfzeile1$)
  3064.   b%=VAL(cfzinshfzeile2$)
  3065.   c%=VAL(cfzinshfzeile3$)
  3066.   IF a%>0 AND CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr1&+(a%-32)*7)}}=""
  3067.     ~@rsc_alert(1,"Die angegebene Hauptzeile|ist nicht belegt !"," [OK ",1)
  3068.     erstes_objekt%=cfzinshfzeile1&
  3069.     error%=TRUE
  3070.   ELSE IF b%>0 AND CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr1&+(b%-32)*7)}}=""
  3071.     ~@rsc_alert(1,"Die angegebene Hauptzeile|ist nicht belegt !"," [OK ",1)
  3072.     erstes_objekt%=cfzinshfzeile2&
  3073.     error%=TRUE
  3074.   ELSE IF c%>0 AND CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr1&+(c%-32)*7)}}=""
  3075.     ~@rsc_alert(1,"Die angegebene Hauptzeile|ist nicht belegt !"," [OK ",1)
  3076.     erstes_objekt%=cfzinshfzeile3&
  3077.     error%=TRUE
  3078.   ENDIF
  3079.   '
  3080.   ' c) nur Normalzins _oder_ Diskontzins angegeben ?
  3081.   IF cfnormalzins1$<>"" AND cfdiskontzins1$<>""
  3082.     ~@rsc_alert(1,"Bitte nur Normalzins|oder Diskontzins angeben !"," [OK ",1)
  3083.     erstes_objekt%=cfnormalzins1&
  3084.     error%=TRUE
  3085.   ELSE IF cfnormalzins2$<>"" AND cfdiskontzins2$<>""
  3086.     ~@rsc_alert(1,"Bitte nur Normalzins|oder Diskontzins angeben !"," [OK ",1)
  3087.     erstes_objekt%=cfnormalzins2&
  3088.     error%=TRUE
  3089.   ELSE IF cfnormalzins3$<>"" AND cfdiskontzins3$<>""
  3090.     ~@rsc_alert(1,"Bitte nur Normalzins|oder Diskontzins angeben !"," [OK ",1)
  3091.     erstes_objekt%=cfnormalzins3&
  3092.     error%=TRUE
  3093.   ENDIF
  3094.   '
  3095.   ' d) mindestens HF-Zeile, Zinssatz und Zinsstartdatum eingegeben ?
  3096.   ' Produkt ist null, wenn 1 Feld Leer, Summe>0, wenn ein Feld besetzt
  3097.   IF LEN(cfzinshfzeile1$)*LEN(cfzinsstart1$)*MAX(LEN(cfdiskontzins1$),LEN(cfnormalzins1$))=0 AND LEN(cfzinshfzeile1$+cfnormalzins1$+cfdiskontzins1$+cfzinsstart1$)>0
  3098.     ~@rsc_alert(1,"Bei Zinsen nichts oder mind.|Bezugszeile _und_ Zinssatz|_und_ Zinsbeginn angeben !"," [OK ",1)
  3099.     erstes_objekt%=cfzinshfzeile1&
  3100.     error%=TRUE
  3101.   ELSE IF LEN(cfzinshfzeile2$)*LEN(cfzinsstart2$)*MAX(LEN(cfdiskontzins2$),LEN(cfnormalzins2$))=0 AND LEN(cfzinshfzeile2$+cfnormalzins2$+cfdiskontzins2$+cfzinsstart2$)>0
  3102.     ~@rsc_alert(1,"Bei Zinsen nichts oder mind.|Bezugszeile _und_ Zinssatz|_und_ Zinsbeginn angeben !"," [OK ",1)
  3103.     erstes_objekt%=cfzinshfzeile2&
  3104.     error%=TRUE
  3105.   ELSE IF LEN(cfzinshfzeile3$)*LEN(cfzinsstart3$)*MAX(LEN(cfdiskontzins3$),LEN(cfnormalzins3$))=0 AND LEN(cfzinshfzeile3$+cfnormalzins3$+cfdiskontzins3$+cfzinsstart3$)>0
  3106.     ~@rsc_alert(1,"Bei Zinsen nichts oder mind.|Bezugszeile _und_ Zinssatz|_und_ Zinsbeginn angeben !"," [OK ",1)
  3107.     erstes_objekt%=cfzinshfzeile3&
  3108.     error%=TRUE
  3109.   ENDIF
  3110.   '
  3111.   '
  3112.   ' 5. ausgerechnete Zinsen prüfen
  3113.   IF LEN(cfausgerzinsab$)*LEN(cfausgerzinsbis$)*LEN(cfausgerzinsbetr$)=0 AND LEN(cfausgerzinsab$+cfausgerzinsbis$+cfausgerzinsbetr$)>0
  3114.     ~@rsc_alert(1,"Bei ausgerechneten Zinsen|bitte komplette|Eingaben machen !"," [OK ",1)
  3115.     erstes_objekt%=cfausgerzinsab&
  3116.     error%=TRUE
  3117.   ENDIF
  3118.   '
  3119.   ' 6. sonstige Ausgaben
  3120.   IF cfsonstauslagenb$="" XOR cfsonstauslagenn$=""
  3121.     ~@rsc_alert(1,"Bei sonstigen Auslagen|bitte Betrag _und_|Bezeichnung eingeben !"," [OK ",1)
  3122.     erstes_objekt%=cfsonstauslagenb&
  3123.     error%=TRUE
  3124.   ENDIF
  3125. RETURN
  3126. ' *************************************************
  3127. > PROCEDURE cmb_hfkatalog
  3128.   cmbhfkatalogbaum_adr%=rsc_adr%(cmbhfkatalogbaum&)
  3129.   @dialog_positionieren(cmbhfkatalogbaum&)
  3130.   '
  3131.   ' Vorbereitung des Dialogs
  3132.   @rsc_draw(cmbhfkatalogbaum&,fensterdial%)
  3133.   DO
  3134.     ex_obj%=@rsc_do(cmbhfkatalogbaum&,0,dummy&)  ! 0, da kein editobjekt;
  3135.     SELECT ex_obj%
  3136.     CASE chabisl&
  3137.       @unhide(cmbhfkatalogbaum_adr%,chkatfdgpopup1&)
  3138.       @hide(cmbhfkatalogbaum_adr%,chkatfdgpopup2&)
  3139.       @hide(cmbhfkatalogbaum_adr%,chkatfdgpopup3&)
  3140.       @objc_update(cmbhfkatalogbaum_adr%,chkatfdgpopup1&)
  3141.       ' Tastaturbedienbare Strings (liegen unsichtbar übereinander)
  3142.       @unhide(cmbhfkatalogbaum_adr%,chkatfdg1&)
  3143.       @hide(cmbhfkatalogbaum_adr%,chkatfdg2&)
  3144.       @hide(cmbhfkatalogbaum_adr%,chkatfdg3&)
  3145.     CASE chmbiss&
  3146.       @unhide(cmbhfkatalogbaum_adr%,chkatfdgpopup2&)
  3147.       @hide(cmbhfkatalogbaum_adr%,chkatfdgpopup1&)
  3148.       @hide(cmbhfkatalogbaum_adr%,chkatfdgpopup3&)
  3149.       @objc_update(cmbhfkatalogbaum_adr%,chkatfdgpopup2&)
  3150.       ' Tastaturbedienbare Strings
  3151.       @unhide(cmbhfkatalogbaum_adr%,chkatfdg2&)
  3152.       @hide(cmbhfkatalogbaum_adr%,chkatfdg1&)
  3153.       @hide(cmbhfkatalogbaum_adr%,chkatfdg3&)
  3154.     CASE chtbisz&
  3155.       @unhide(cmbhfkatalogbaum_adr%,chkatfdgpopup3&)
  3156.       @hide(cmbhfkatalogbaum_adr%,chkatfdgpopup1&)
  3157.       @hide(cmbhfkatalogbaum_adr%,chkatfdgpopup2&)
  3158.       @objc_update(cmbhfkatalogbaum_adr%,chkatfdgpopup3&)
  3159.       ' Tastaturbedienbare Strings
  3160.       @unhide(cmbhfkatalogbaum_adr%,chkatfdg3&)
  3161.       @hide(cmbhfkatalogbaum_adr%,chkatfdg1&)
  3162.       @hide(cmbhfkatalogbaum_adr%,chkatfdg2&)
  3163.     ENDSELECT
  3164.   LOOP UNTIL ex_obj%=chok& OR ex_obj%=chabbruch&
  3165.   '
  3166.   ' Beenden des Dialogs
  3167.   @rsc_back(cmbhfkatalogbaum&)
  3168.   @select(cmbhfkatalogbaum_adr%,ex_obj%,FALSE)
  3169.   ' Dialog beendet
  3170.   '
  3171.   IF ex_obj%=chok&
  3172.     ' Forderungsartnummer rausfinden
  3173.     IF @selected(cmbhfkatalogbaum_adr%,chabisl&)=TRUE
  3174.       katalognr%=VAL(TRIM$(CHAR{{OB_SPEC(cmbhfkatalogbaum_adr%,chkatfdgpopup1&)}}))
  3175.     ELSE IF @selected(cmbhfkatalogbaum_adr%,chmbiss&)=TRUE
  3176.       katalognr%=VAL(TRIM$(CHAR{{OB_SPEC(cmbhfkatalogbaum_adr%,chkatfdgpopup2&)}}))
  3177.     ELSE IF @selected(cmbhfkatalogbaum_adr%,chtbisz&)=TRUE
  3178.       katalognr%=VAL(TRIM$(CHAR{{OB_SPEC(cmbhfkatalogbaum_adr%,chkatfdgpopup3&)}}))
  3179.     ENDIF
  3180.     ' Suchen, wo im Buchungsbaum die Katalognummer eingesetzt werden soll+ einsetzen
  3181.     IF CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr1&)}}=""
  3182.       CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr1&)}}=STR$(katalognr%)
  3183.       @objc_update(cmbforderungbaum_adr%,cfkatalognr1&)
  3184.     ELSE IF CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr2&)}}=""
  3185.       CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr2&)}}=STR$(katalognr%)
  3186.       @objc_update(cmbforderungbaum_adr%,cfkatalognr2&)
  3187.     ELSE IF CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr3&)}}=""
  3188.       CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfkatalognr3&)}}=STR$(katalognr%)
  3189.       @objc_update(cmbforderungbaum_adr%,cfkatalognr3&)
  3190.     ENDIF
  3191.   ELSE  ! Abbruch gewählt
  3192.     katalognr%=0
  3193.   ENDIF
  3194.   '
  3195. RETURN
  3196. ' ***************************************************
  3197. > PROCEDURE cmb_zusatzeingabe
  3198.   cmbzusatzbaum_adr%=rsc_adr%(cmbzusatzbaum&)
  3199.   @dialog_positionieren(cmbzusatzbaum&)
  3200.   '
  3201.   ' Radiobuttons einstellen
  3202.   IF czgglunabhaengig$="X"  ! Anspruch ist gegenleistungsabhängig
  3203.     @select(cmbzusatzbaum_adr%,czgglunabhaengig&,TRUE)
  3204.     @select(cmbzusatzbaum_adr%,czgglabhaengig&,FALSE)
  3205.   ELSE  ! Anspruch ist Gegenleistungsunabhängig
  3206.     @select(cmbzusatzbaum_adr%,czgglunabhaengig&,FALSE)
  3207.     @select(cmbzusatzbaum_adr%,czgglabhaengig&,TRUE)
  3208.   ENDIF
  3209.   ' Checkboxen einstellen
  3210.   IF czvorsteuerabzug$="X"  ! Verdreht wegen dem 'nicht' im Formular
  3211.     @select(cmbzusatzbaum_adr%,czvorsteuerabzug&,FALSE)
  3212.   ELSE
  3213.     @select(cmbzusatzbaum_adr%,czvorsteuerabzug&,TRUE)
  3214.   ENDIF
  3215.   IF czstreitverfahrn$="X"
  3216.     @select(cmbzusatzbaum_adr%,czstreitverfahrn&,TRUE)
  3217.   ELSE
  3218.     @select(cmbzusatzbaum_adr%,czstreitverfahrn&,FALSE)
  3219.   ENDIF
  3220.   '
  3221.   ' Popups einstellen
  3222.   @rsc_write_popup(cmbzusatzbaum&,czgerichtpopup&,VAL(czgericht$))
  3223.   '
  3224.   ' Textfelder einstellen
  3225.   ' Erklärungen
  3226.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czgerichtplz&)}}=czgerichtplz$
  3227.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czgerichtort&)}}=czgerichtort$
  3228.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czmahngerichtplz&)}}=czmahngerichtplz$
  3229.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czmahngerichtort&)}}=czmahngerichtort$
  3230.   '
  3231.   ' Nebenforderungen
  3232.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czmahnkosten&)}}=czmahnkosten$
  3233.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czauskuenfte&)}}=czauskuenfte$
  3234.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czbankruecklast&)}}=czbankruecklast$
  3235.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czinkassokosten&)}}=czinkassokosten$
  3236.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czsonstnfdgbetr&)}}=czsonstnfdgbetr$
  3237.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czsonstnfdgname&)}}=czsonstnfdgname$
  3238.   '
  3239.   ' Abtretung
  3240.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czaltglaeubiger&)}}=czaltglaeubiger$
  3241.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czabtretungdatum&)}}=czabtretungdatum$
  3242.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czplz&)}}=czplz$
  3243.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czort&)}}=czort$
  3244.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czauslkz&)}}=czauslkz$
  3245.   '
  3246.   ' Verbraucherkredit
  3247.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czhfzeile1&)}}=czhfzeile1$
  3248.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czvertragsdatum1&)}}=czvertragsdatum1$
  3249.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czeffektivzins1&)}}=czeffektivzins1$
  3250.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czhfzeile2&)}}=czhfzeile2$
  3251.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czvertragsdatum2&)}}=czvertragsdatum2$
  3252.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czeffektivzins2&)}}=czeffektivzins2$
  3253.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czhfzeile3&)}}=czhfzeile3$
  3254.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czvertragsdatum3&)}}=czvertragsdatum3$
  3255.   CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czeffektivzins3&)}}=czeffektivzins3$
  3256.   '
  3257.   ' Zeichnen des Dialogs
  3258.   @rsc_draw(cmbzusatzbaum&,fensterdial%)
  3259.   erstes_obj%=czgerichtplz&
  3260. neu_cmb_zusatzeingabe:
  3261.   DO
  3262.     ex_obj%=@rsc_do(cmbzusatzbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  3263.   LOOP UNTIL ex_obj%=czok& OR ex_obj%=czabbruch&
  3264.   '
  3265.   IF ex_obj%=czok&  ! dann Daten auslesen
  3266.     ' Radiobuttons abfragen
  3267.     IF @selected(cmbzusatzbaum_adr%,czgglunabhaengig&)=TRUE
  3268.       czgglunabhaengig$="X"
  3269.       czgglabhaengig$=" "
  3270.     ELSE  ! Anspruch ist Gegenleistungsunabhängig
  3271.       czgglunabhaengig$=" "
  3272.       czgglabhaengig$="X"
  3273.     ENDIF
  3274.     '
  3275.     ' Checkboxen abfragen
  3276.     IF @selected(cmbzusatzbaum_adr%,czvorsteuerabzug&)=FALSE
  3277.       czvorsteuerabzug$="X"  ! Verdreht wegen dem 'nicht' im Formular
  3278.     ELSE
  3279.       czvorsteuerabzug$=" "  ! Verdreht wegen dem 'nicht' im Formular
  3280.     ENDIF
  3281.     IF @selected(cmbzusatzbaum_adr%,czstreitverfahrn&)=TRUE
  3282.       czstreitverfahrn$="X"
  3283.     ELSE
  3284.       czstreitverfahrn$=" "
  3285.     ENDIF
  3286.     '
  3287.     ' Popups abfragen  ! Ergebnis ist nur die Zahl, nicht der ganze Eintrag
  3288.     czgericht$=STR$(@rsc_read_popup(cmbzusatzbaum&,czgerichtpopup&))
  3289.     '
  3290.     ' Textfelder abfragen
  3291.     ' Erklärungen
  3292.     czgerichtplz$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czgerichtplz&)}}
  3293.     czgerichtort$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czgerichtort&)}}
  3294.     IF czgerichtort$=""
  3295.       ~@rsc_alert(1,"Streitgericht muß|eingegeben werden !"," [OK ",1)
  3296.       erstes_objekt%=czgerichtplz&
  3297.       @select(cmbzusatzbaum_adr%,ex_obj%,FALSE)
  3298.       @objc_update(cmbzusatzbaum_adr%,ex_obj%)
  3299.       GOTO neu_cmb_zusatzeingabe
  3300.     ENDIF
  3301.     czmahngerichtplz$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czmahngerichtplz&)}}
  3302.     czmahngerichtort$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czmahngerichtort&)}}
  3303.     IF czmahngerichtort$=""
  3304.       ~@rsc_alert(1,"Mahngericht muß|eingegeben werden !"," [OK ",1)
  3305.       erstes_objekt%=czmahngerichtplz&
  3306.       @select(cmbzusatzbaum_adr%,ex_obj%,FALSE)
  3307.       @objc_update(cmbzusatzbaum_adr%,ex_obj%)
  3308.       GOTO neu_cmb_zusatzeingabe
  3309.     ENDIF
  3310.     '
  3311.     ' Nebenforderungen
  3312.     czmahnkosten$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czmahnkosten&)}}
  3313.     czauskuenfte$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czauskuenfte&)}}
  3314.     czbankruecklast$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czbankruecklast&)}}
  3315.     czinkassokosten$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czinkassokosten&)}}
  3316.     czsonstnfdgbetr$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czsonstnfdgbetr&)}}
  3317.     czsonstnfdgname$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czsonstnfdgname&)}}
  3318.     '
  3319.     ' Abtretung
  3320.     czaltglaeubiger$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czaltglaeubiger&)}}
  3321.     czabtretungdatum$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czabtretungdatum&)}}
  3322.     czplz$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czplz&)}}
  3323.     czort$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czort&)}}
  3324.     czauslkz$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czauslkz&)}}
  3325.     '
  3326.     ' Verbraucherkredit
  3327.     czhfzeile1$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czhfzeile1&)}}
  3328.     czvertragsdatum1$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czvertragsdatum1&)}}
  3329.     czeffektivzins1$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czeffektivzins1&)}}
  3330.     czhfzeile2$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czhfzeile2&)}}
  3331.     czvertragsdatum2$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czvertragsdatum2&)}}
  3332.     czeffektivzins2$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czeffektivzins2&)}}
  3333.     czhfzeile3$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czhfzeile3&)}}
  3334.     czvertragsdatum3$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czvertragsdatum3&)}}
  3335.     czeffektivzins3$=CHAR{{OB_SPEC(cmbzusatzbaum_adr%,czeffektivzins3&)}}
  3336.   ELSE
  3337.     abbruch%=TRUE  ! zum Durchschleifen für andere Programme
  3338.   ENDIF
  3339.   '
  3340.   '
  3341.   ' Beenden des Dialogs
  3342.   @rsc_back(cmbzusatzbaum&)
  3343.   @select(cmbzusatzbaum_adr%,ex_obj%,FALSE)
  3344.   ' Dialog beendet
  3345. RETURN
  3346. ' *********************************************
  3347. > PROCEDURE cmb_druck
  3348.   IF OUT?(0)=FALSE   !GEMDOS(17)=0
  3349.     IF @rsc_alert(1,"Bitte Schalten Sie|Ihren Drucker ein.","[OK|[Abbruch",1)=2
  3350.       abbruch%=1
  3351.       GOTO cmb_druckende
  3352.     ENDIF
  3353.   ENDIF
  3354.   wasdrucken%=32  ! hier ist das CMB-Muster
  3355.   @druckerladen(3)  ! CMB-Drucker Laden
  3356.   @ausgabestring_erstellen(TRUE)  ! mit Steuerzeichen
  3357.   '
  3358.   ' DRUCKBEGINN
  3359.   PRINT #0;initialisierung$;
  3360.   ' EINSETZEN DER STEUERZEICHEN FÜR DIE SEITENLÄNGE
  3361.   pos%=INSTR(seitenlaenge$,CHR$(255))  ! CHR 255 wird durch STRING steitenlänge ersetzt
  3362.   IF pos%>0  ! D.h. Steuercode enthält CHR$(255)
  3363.     PRINT #0;LEFT$(seitenlaenge$,pos%-1);cmb_seitenlaenge%;MID$(seitenlaenge$,pos%+1);
  3364.   ENDIF
  3365.   pos%=INSTR(seitenlaenge$,CHR$(254))  ! CHR 254 wird durch CHR$(seitenlänge) ersetzt
  3366.   IF pos%>0  ! D.h. Steuercode enthält CHR$(254)
  3367.     PRINT #0;LEFT$(seitenlaenge$,pos%-1);CHR$(cmb_seitenlaenge%);MID$(linkerrand$,pos%+1);
  3368.   ENDIF
  3369.   '
  3370.   ' EINSETZEN DER STEUERZEICHEN DEN LINKEN RAND
  3371.   IF INSTR(linkerrand$,CHR$(255))>0  ! CHR 255 wird durch abstand_von_links ersetzt
  3372.     pos%=INSTR(linkerrand$,CHR$(255))  ! CHR 255 wird durch abstand_von_links ersetzt
  3373.     PRINT #0;LEFT$(linkerrand$,pos%-1);cmb_abstand_von_links%;MID$(linkerrand$,pos%+1);
  3374.   ELSE IF INSTR(linkerrand$,CHR$(254))>0  ! CHR 254 wird durch chr$(abstand_von_links) ersetzt
  3375.     pos%=INSTR(linkerrand$,CHR$(254))  ! CHR 254 wird durch chr$(abstand_von_links) ersetzt
  3376.     PRINT #0;LEFT$(linkerrand$,pos%-1);CHR$(cmb_abstand_von_links%);MID$(linkerrand$,pos%+1);
  3377.   ELSE  ! linker Abstand hat feste Steuersequenz
  3378.     PRINT #0;linkerrand$;
  3379.   ENDIF
  3380.   '
  3381.   ' RAND
  3382.   FOR i%=1 TO cmb_abstand_von_oben%
  3383.     PRINT #0
  3384.   NEXT i%
  3385.   '  GOSUB zeilendruck(CHR$(253)+CHR$(5)+ausgabe$)  ! Chr$(253,5) unterdrückt Umbruch
  3386.   PRINT #0;ausgabe$;
  3387.   PRINT #0;formfeed$;nachspann$; ! Auswurf des letzten Blattes ohne CR/LF
  3388. cmb_druckende:
  3389.   @mausform(0)
  3390.   @druckerladen(1)  ! Standarddrucker laden
  3391. RETURN
  3392. ' ******************************************
  3393. > PROCEDURE cmb_dazubuchen
  3394.   @cmb_hauptforderungen_dazubuchen
  3395.   @cmb_nebenforderungen_dazubuchen
  3396.   @cmb_kapitalisierte_zinsen_dazubuchen
  3397.   @cmb_mahnbescheidskosten_dazubuchen
  3398.   @nachdatensortieren
  3399.   @neuberechnung(1)
  3400.   @forderungstextfeld
  3401.   @redraw_part(0,0)
  3402. RETURN
  3403. ' *******************************************************
  3404. > PROCEDURE cmb_hauptforderungen_dazubuchen
  3405.   '
  3406.   DIM hilfsfeld#(15,4)  ! HF(0,x),HF(4,x) und HF(8,x) sind die HFs, HF(12,x)=sonstige HF
  3407.   ' Sie werden aufgespalten in die dazwischenliegenden Indices, wenn Zinsen
  3408.   ' nur aus Teilen der Hauptforderung berechnet sind
  3409.   ' der zweite index ist: HF,HF-Datum,Zins(+-),Zinsdatum%
  3410.   '
  3411.   '
  3412.   ' 1. Hauptforderungen eintragen und HF-Datum
  3413.   '
  3414.   @zahlenumwandlung(9,CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag1&)}},betrag#,dummy#)
  3415.   hilfsfeld#(0,1)=betrag#
  3416.   datum$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum1&)}} ! HF ist spätestens da entstanden
  3417.   GOSUB datumsumwandlung(cfabdatum1$,datum%,kontrolle%)
  3418.   hilfsfeld#(0,2)=datum%
  3419.   '
  3420.   @zahlenumwandlung(9,CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag2&)}},betrag#,dummy#)
  3421.   hilfsfeld#(4,1)=betrag#
  3422.   datum$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum2&)}} ! HF ist spätestens da entstanden
  3423.   GOSUB datumsumwandlung(cfabdatum2$,datum%,kontrolle%)
  3424.   hilfsfeld#(4,2)=datum%
  3425.   '
  3426.   @zahlenumwandlung(9,CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag3&)}},betrag#,dummy#)
  3427.   hilfsfeld#(8,1)=betrag#
  3428.   datum$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum3&)}} ! HF ist spätestens da entstanden
  3429.   GOSUB datumsumwandlung(cfabdatum3$,datum%,kontrolle%)
  3430.   hilfsfeld#(8,2)=datum%
  3431.   '
  3432.   @zahlenumwandlung(9,CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstigebetrag&)}},betrag#,dummy#)
  3433.   hilfsfeld#(12,1)=betrag#
  3434.   GOSUB datumsumwandlung(LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2),datum%,kontrolle%)
  3435.   hilfsfeld#(12,2)=datum%
  3436.   '
  3437.   ' 2. Zinsen raussuchen und zu Zeilen sortieren
  3438.   '
  3439.   ' Erste Zinszeile
  3440.   IF cfzinshfzeile1$<>"" AND cfzinsende1$=""
  3441.     ' Begründung: Zinsen ohne Zinsbeginn gibt's nicht, nur Zinsen ohne
  3442.     ' Zinsende sind laufende Zinsen, Zinsen mit angegebenen Anfangs- und
  3443.     ' Enddatum sin kapitalisierte Zinsen (vgl. PROCEDURE kapitalisierte Zinsen)
  3444.     ' cfzinshfzeile kann sein 32-34 oder 36 (sonst. HF)
  3445.     ' Index der einzutragenden Zeile ins Feld HF finden
  3446.     index%=MIN(VAL(TRIM$(cfzinshfzeile1$))-32,3)*4
  3447.     IF cfzinsturnus1$="1"  ! jährliche Zinsen
  3448.       zinsfaktor%=1
  3449.     ELSE IF cfzinsturnus1$="2"  ! monatliche Zinsen
  3450.       zinsfaktor%=12
  3451.     ELSE IF cfzinsturnus1$="3"  ! tägliche Zinsen
  3452.       zinsfaktor%=360
  3453.     ENDIF
  3454.     @zahlenumwandlung(2,cfnormalzins1$,zins#,dummy#)
  3455.     IF zins#=0
  3456.       @zahlenumwandlung(2,cfdiskontzins1$,zins#,dummy#)
  3457.       zins#=-1*zins#  ! Zins über Diskont ist programmintern negativ
  3458.     ENDIF
  3459.     GOSUB datumsumwandlung(cfzinsstart1$,zinsdatum%,kontrolle%)
  3460.     @zahlenumwandlung(9,cfzinsbasis1$,basis#,dummy#)
  3461.     IF basis#=0  ! Also Zinsen aus der ganzen HF==> bei index 1,4,7,10 eintragen
  3462.       hilfsfeld#(index%,3)=zins#
  3463.       hilfsfeld#(index%,4)=zinsdatum%
  3464.     ELSE  ! Zinsbasiseingegeben ==> Grund-HF aufspalten in 2 verschieden verzinsliche HFs
  3465.       hilfsfeld#(index%,1)=hilfsfeld#(index%,1)-basis#  ! alte HF verringert
  3466.       IF hilfsfeld#(index%+1,1)=0  ! leere Feldzeile finden
  3467.         hilfsfeld#(index%+1,1)=basis#
  3468.         hilfsfeld#(index%+1,2)=hilfsfeld#(index%,2)  ! HF-Datum gleich
  3469.         hilfsfeld#(index%+1,3)=zins#
  3470.         hilfsfeld#(index%+1,4)=zinsdatum%
  3471.       ELSE IF hilfsfeld#(index%+2,1)=0
  3472.         hilfsfeld#(index%+2,1)=basis#
  3473.         hilfsfeld#(index%+2,2)=hilfsfeld#(index%,2)  ! HF-Datum gleich
  3474.         hilfsfeld#(index%+2,3)=zins#
  3475.         hilfsfeld#(index%+2,4)=zinsdatum%
  3476.       ENDIF
  3477.     ENDIF
  3478.   ENDIF
  3479.   '
  3480.   '
  3481.   '
  3482.   ' Zweite Zinszeile
  3483.   IF cfzinshfzeile2$<>"" AND cfzinsende2$=""
  3484.     ' Begründung: Zinsen ohne Zinsbeginn gibt's nicht, nur Zinsen ohne
  3485.     ' Zinsende sind laufende Zinsen, Zinsen mit angegebenen Anfangs- und
  3486.     ' Enddatum sin kapitalisierte Zinsen (vgl. PROCEDURE kapitalisierte Zinsen)
  3487.     ' cfzinshfzeile kann sein 32-34 oder 36 (sonst. HF)
  3488.     ' Index der einzutragenden Zeile ins Feld HF finden
  3489.     index%=MIN(VAL(TRIM$(cfzinshfzeile2$))-32,3)*4
  3490.     IF cfzinsturnus2$="1"  ! jährliche Zinsen
  3491.       zinsfaktor%=1
  3492.     ELSE IF cfzinsturnus2$="2"  ! monatliche Zinsen
  3493.       zinsfaktor%=12
  3494.     ELSE IF cfzinsturnus2$="3"  ! tägliche Zinsen
  3495.       zinsfaktor%=360
  3496.     ENDIF
  3497.     @zahlenumwandlung(2,cfnormalzins2$,zins#,dummy#)
  3498.     IF zins#=0
  3499.       @zahlenumwandlung(2,cfdiskontzins2$,zins#,dummy#)
  3500.       zins#=-1*zins#  ! Zins über Diskont ist programmintern negativ
  3501.     ENDIF
  3502.     GOSUB datumsumwandlung(cfzinsstart2$,zinsdatum%,kontrolle%)
  3503.     @zahlenumwandlung(9,cfzinsbasis2$,basis#,dummy#)
  3504.     IF basis#=0  ! Also Zinsen aus der ganzen HF==> bei index 1,4,7,10 eintragen
  3505.       hilfsfeld#(index%,3)=zins#
  3506.       hilfsfeld#(index%,4)=zinsdatum%
  3507.     ELSE  ! Zinsbasiseingegeben ==> Grund-HF aufspalten in 2 verschieden verzinsliche HFs
  3508.       hilfsfeld#(index%,1)=hilfsfeld#(index%,1)-basis#  ! alte HF verringert
  3509.       IF hilfsfeld#(index%+1,1)=0  ! leere Feldzeile finden
  3510.         hilfsfeld#(index%+1,1)=basis#
  3511.         hilfsfeld#(index%+1,2)=hilfsfeld#(index%,2)  ! HF-Datum gleich
  3512.         hilfsfeld#(index%+1,3)=zins#
  3513.         hilfsfeld#(index%+1,4)=zinsdatum%
  3514.       ELSE IF hilfsfeld#(index%+2,1)=0
  3515.         hilfsfeld#(index%+2,1)=basis#
  3516.         hilfsfeld#(index%+2,2)=hilfsfeld#(index%,2)  ! HF-Datum gleich
  3517.         hilfsfeld#(index%+2,3)=zins#
  3518.         hilfsfeld#(index%+2,4)=zinsdatum%
  3519.       ENDIF
  3520.     ENDIF
  3521.   ENDIF
  3522.   '
  3523.   '
  3524.   '
  3525.   ' Dritte Zinszeile
  3526.   IF cfzinshfzeile3$<>"" AND cfzinsende3$=""
  3527.     ' Begründung: Zinsen ohne Zinsbeginn gibt's nicht, nur Zinsen ohne
  3528.     ' Zinsende sind laufende Zinsen, Zinsen mit angegebenen Anfangs- und
  3529.     ' Enddatum sin kapitalisierte Zinsen (vgl. PROCEDURE kapitalisierte Zinsen)
  3530.     ' cfzinshfzeile kann sein 32-34 oder 36 (sonst. HF)
  3531.     ' Index der einzutragenden Zeile ins Feld HF finden
  3532.     index%=MIN(VAL(TRIM$(cfzinshfzeile3$))-32,3)*4
  3533.     IF cfzinsturnus3$="1"  ! jährliche Zinsen
  3534.       zinsfaktor%=1
  3535.     ELSE IF cfzinsturnus3$="2"  ! monatliche Zinsen
  3536.       zinsfaktor%=12
  3537.     ELSE IF cfzinsturnus3$="3"  ! tägliche Zinsen
  3538.       zinsfaktor%=360
  3539.     ENDIF
  3540.     @zahlenumwandlung(2,cfnormalzins3$,zins#,dummy#)
  3541.     IF zins#=0
  3542.       @zahlenumwandlung(2,cfdiskontzins3$,zins#,dummy#)
  3543.       zins#=-1*zins#  ! Zins über Diskont ist programmintern negativ
  3544.     ENDIF
  3545.     GOSUB datumsumwandlung(cfzinsstart3$,zinsdatum%,kontrolle%)
  3546.     @zahlenumwandlung(9,cfzinsbasis3$,basis#,dummy#)
  3547.     IF basis#=0  ! Also Zinsen aus der ganzen HF==> bei index 1,4,7,10 eintragen
  3548.       hilfsfeld#(index%,3)=zins#
  3549.       hilfsfeld#(index%,4)=zinsdatum%
  3550.     ELSE  ! Zinsbasiseingegeben ==> Grund-HF aufspalten in 2 verschieden verzinsliche HFs
  3551.       hilfsfeld#(index%,1)=hilfsfeld#(index%,1)-basis#  ! alte HF verringert
  3552.       IF hilfsfeld#(index%+1,1)=0  ! leere Feldzeile finden
  3553.         hilfsfeld#(index%+1,1)=basis#
  3554.         hilfsfeld#(index%+1,2)=hilfsfeld#(index%,2)  ! HF-Datum gleich
  3555.         hilfsfeld#(index%+1,3)=zins#
  3556.         hilfsfeld#(index%+1,4)=zinsdatum%
  3557.       ELSE IF hilfsfeld#(index%+2,1)=0
  3558.         hilfsfeld#(index%+2,1)=basis#
  3559.         hilfsfeld#(index%+2,2)=hilfsfeld#(index%,2)  ! HF-Datum gleich
  3560.         hilfsfeld#(index%+2,3)=zins#
  3561.         hilfsfeld#(index%+2,4)=zinsdatum%
  3562.       ENDIF
  3563.     ENDIF
  3564.   ENDIF
  3565.   '
  3566.   '
  3567.   ' Alles im Kasten ==> Buchen in die Forderungsberechnung
  3568.   '
  3569.   aufstellungsaenderung#=TRUE  ! für SPEICHERN ? -Abfrage benötigt
  3570.   GOSUB freiezeilefinden(1,freiezeile%)  ! bei Zeile 1 anfangen
  3571.   FOR i%=0 TO 15
  3572.     IF hilfsfeld#(i%,1)>0  ! Forderung vorhanden also buchen
  3573.       fdgdatum%(freiezeile%)=hilfsfeld#(i%,2)
  3574.       fdgart#(freiezeile%)=1  ! Hauptforderung
  3575.       betrag#(freiezeile%)=hilfsfeld#(i%,1)
  3576.       restbetrag#(freiezeile%)=hilfsfeld#(i%,1)
  3577.       zinssatz#(freiezeile%)=hilfsfeld#(i%,3)
  3578.       zinsdatum%(freiezeile%)=hilfsfeld#(i%,4)
  3579.       INC freiezeile%
  3580.     ENDIF
  3581.   NEXT i%
  3582.   ERASE hilfsfeld#()
  3583. RETURN
  3584. ' ********************************************************
  3585. > PROCEDURE cmb_kapitalisierte_zinsen_dazubuchen
  3586.   ' 1.Schritt: alle kapitalisierten Zinsen raussuchen
  3587.   ' das sind die, bei denen Anfangs _und_ Enddatum feststehen, also Fixbeträge
  3588.   '
  3589.   ' 1. Zinszeile
  3590.   IF cfzinsstart1$<>"" AND cfzinsende1$<>""
  3591.     ' Dann Anfangs- und Enddatum belegt
  3592.     ' ------ Zinstage ermitteln
  3593.     GOSUB datumsumwandlung(cfzinsstart1$,datum1%,kontrolle%)
  3594.     GOSUB datumsumwandlung(cfzinsende1$,datum2%,kontrolle%)
  3595.     @zinstage(datum1%,datum2%,zinstage%)  ! Zinstage jetzt bekannt
  3596.     ' ------ Zinsbasis ermitteln
  3597.     IF cfzinsbasis1$<>""
  3598.       @zahlenumwandlung(9,cfzinsbasis1$,zinsbasis#,dummy#)
  3599.     ELSE IF VAL(cfzinshfzeile1$)=32
  3600.       @zahlenumwandlung(9,cfbetrag1$,zinsbasis#,dummy#)
  3601.     ELSE IF VAL(cfzinshfzeile1$)=33
  3602.       @zahlenumwandlung(9,cfbetrag2$,zinsbasis#,dummy#)
  3603.     ELSE IF VAL(cfzinshfzeile1$)=34
  3604.       @zahlenumwandlung(9,cfbetrag3$,zinsbasis#,dummy#)
  3605.     ELSE
  3606.       zinsbasis#=0
  3607.     ENDIF
  3608.     ' ---------- Zinssatz ermitteln
  3609.     @zahlenumwandlung(2,cfnormalzins1$,zinssatz#,dummy#)
  3610.     IF zinssatz#=0  ! Dann diskontabhängiger Zins
  3611.       @zahlenumwandlung(2,cfdiskontzins1$,zinssatz#,dummy#)
  3612.       zinssatz#=-1*zinssatz#  ! diskontabhägige Zinsen programmintern negativ
  3613.     ENDIF
  3614.     ' ------------- Zinsturnus ermitteln
  3615.     IF VAL(cfzinsturnus1$)=1
  3616.       ' jährliche Zinsen
  3617.       turnusfaktor#=1
  3618.     ELSE IF VAL(cfzinsturnus1$)=2
  3619.       ' monatliche Zinsen, also Zinssatz * 12
  3620.       turnusfaktor#=12
  3621.     ELSE IF VAL(cfzinsturnus1$)=3
  3622.       ' tägliche Zinsen, also Zinssatz * 360 Tage
  3623.       turnusfaktor#=360
  3624.     ENDIF
  3625.     '
  3626.     ' ------------- kapitalisierte Zinsen ausrechnen und buchen -------
  3627.     IF zinssatz#>0  ! kein diskontzinsabhängiger Zins
  3628.       betrag#=zinstage%/360*zinsbasis#*zinssatz#/100*turnusfaktor#
  3629.     ELSE
  3630.       @scheckzinsen(datum1%,datum2%,zinsbasis#,-1*zinssatz#,betrag#)
  3631.     ENDIF
  3632.     @kosten_dazusetzen(14,betrag#,"kapitalis. Zinsen")
  3633.     ' ===============================================================
  3634.     ' 2. Zinszeile
  3635.   ELSE IF cfzinsstart2$<>"" AND cfzinsende2$<>""
  3636.     ' Dann Anfangs- und Enddatum belegt
  3637.     ' ------ Zinstage ermitteln
  3638.     GOSUB datumsumwandlung(cfzinsstart2$,datum1%,kontrolle%)
  3639.     GOSUB datumsumwandlung(cfzinsende2$,datum2%,kontrolle%)
  3640.     @zinstage(datum1%,datum2%,zinstage%)  ! Zinstage jetzt bekannt
  3641.     ' ------ Zinsbasis ermitteln
  3642.     IF cfzinsbasis2$<>""
  3643.       @zahlenumwandlung(9,cfzinsbasis2$,zinsbasis#,dummy#)
  3644.     ELSE IF VAL(cfzinshfzeile2$)=32
  3645.       @zahlenumwandlung(9,cfbetrag2$,zinsbasis#,dummy#)
  3646.     ELSE IF VAL(cfzinshfzeile2$)=33
  3647.       @zahlenumwandlung(9,cfbetrag2$,zinsbasis#,dummy#)
  3648.     ELSE IF VAL(cfzinshfzeile2$)=34
  3649.       @zahlenumwandlung(9,cfbetrag3$,zinsbasis#,dummy#)
  3650.     ELSE
  3651.       zinsbasis#=0
  3652.     ENDIF
  3653.     ' ---------- Zinssatz ermitteln
  3654.     @zahlenumwandlung(2,cfnormalzins2$,zinssatz#,dummy#)
  3655.     IF zinssatz#=0  ! Dann diskontabhängiger Zins
  3656.       @zahlenumwandlung(2,cfdiskontzins2$,zinssatz#,dummy#)
  3657.       zinssatz#=-1*zinssatz#  ! diskontabhägige Zinsen programmintern negativ
  3658.     ENDIF
  3659.     ' ------------- Zinsturnus ermitteln
  3660.     IF VAL(cfzinsturnus2$)=1
  3661.       ' jährliche Zinsen
  3662.       turnusfaktor#=1
  3663.     ELSE IF VAL(cfzinsturnus2$)=2
  3664.       ' monatliche Zinsen, also Zinssatz * 12
  3665.       turnusfaktor#=12
  3666.     ELSE IF VAL(cfzinsturnus2$)=3
  3667.       ' tägliche Zinsen, also Zinssatz * 360 Tage
  3668.       turnusfaktor#=360
  3669.     ENDIF
  3670.     '
  3671.     ' ------------- kapitalisierte Zinsen ausrechnen und buchen -------
  3672.     IF zinssatz#>0  ! kein diskontzinsabhängiger Zins
  3673.       betrag#=zinstage%/360*zinsbasis#*zinssatz#/100*turnusfaktor#
  3674.     ELSE
  3675.       @scheckzinsen(datum1%,datum2%,zinsbasis#,-1*zinssatz#,betrag#)
  3676.     ENDIF
  3677.     @kosten_dazusetzen(14,betrag#,"kapitalis. Zinsen") !
  3678.     '
  3679.     '
  3680.     ' ===============================================================
  3681.     ' 3. Zinszeile
  3682.   ELSE IF cfzinsstart3$<>"" AND cfzinsende3$<>""
  3683.     ' Dann Anfangs- und Enddatum belegt
  3684.     ' ------ Zinstage ermitteln
  3685.     GOSUB datumsumwandlung(cfzinsstart3$,datum1%,kontrolle%)
  3686.     GOSUB datumsumwandlung(cfzinsende3$,datum2%,kontrolle%)
  3687.     @zinstage(datum1%,datum2%,zinstage%)  ! Zinstage jetzt bekannt
  3688.     ' ------ Zinsbasis ermitteln
  3689.     IF cfzinsbasis3$<>""
  3690.       @zahlenumwandlung(9,cfzinsbasis3$,zinsbasis#,dummy#)
  3691.     ELSE IF VAL(cfzinshfzeile3$)=32
  3692.       @zahlenumwandlung(9,cfbetrag3$,zinsbasis#,dummy#)
  3693.     ELSE IF VAL(cfzinshfzeile3$)=33
  3694.       @zahlenumwandlung(9,cfbetrag3$,zinsbasis#,dummy#)
  3695.     ELSE IF VAL(cfzinshfzeile3$)=34
  3696.       @zahlenumwandlung(9,cfbetrag3$,zinsbasis#,dummy#)
  3697.     ELSE
  3698.       zinsbasis#=0
  3699.     ENDIF
  3700.     ' ---------- Zinssatz ermitteln
  3701.     @zahlenumwandlung(2,cfnormalzins3$,zinssatz#,dummy#)
  3702.     IF zinssatz#=0  ! Dann diskontabhängiger Zins
  3703.       @zahlenumwandlung(2,cfdiskontzins3$,zinssatz#,dummy#)
  3704.       zinssatz#=-1*zinssatz#  ! diskontabhägige Zinsen programmintern negativ
  3705.     ENDIF
  3706.     ' ------------- Zinsturnus ermitteln
  3707.     IF VAL(cfzinsturnus3$)=1
  3708.       ' jährliche Zinsen
  3709.       turnusfaktor#=1
  3710.     ELSE IF VAL(cfzinsturnus3$)=2
  3711.       ' monatliche Zinsen, also Zinssatz * 12
  3712.       turnusfaktor#=12
  3713.     ELSE IF VAL(cfzinsturnus3$)=3
  3714.       ' tägliche Zinsen, also Zinssatz * 360 Tage
  3715.       turnusfaktor#=360
  3716.     ENDIF
  3717.     '
  3718.     ' ------------- kapitalisierte Zinsen ausrechnen und buchen -------
  3719.     IF zinssatz#>0  ! kein diskontzinsabhängiger Zins
  3720.       betrag#=zinstage%/360*zinsbasis#*zinssatz#/100*turnusfaktor#
  3721.     ELSE
  3722.       @scheckzinsen(datum1%,datum2%,zinsbasis#,-1*zinssatz#,betrag#)
  3723.     ENDIF
  3724.     @kosten_dazusetzen(14,betrag#,"kapitalis. Zinsen") !
  3725.   ENDIF
  3726.   '
  3727. RETURN
  3728. ' ********************************************************
  3729. > PROCEDURE cmb_nebenforderungen_dazubuchen
  3730.   datum$=CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfabdatum1&)}} ! HF ist spätestens da entstanden
  3731.   ' ---------------------
  3732.   ' Hauptforderungsdialog
  3733.   ' ----------------------
  3734.   ' 1. ausgerechnete (kapitalisierte Zinsen)
  3735.   IF cfausgerzinsbetr$<>""
  3736.     @zahlenumwandlung(9,cfausgerzinsbetr$,betrag#,dummy#)
  3737.     kosten_dazusetzen(14,betrag#,"kapitalis. Zinsen")
  3738.   ENDIF
  3739.   ' -------------------------
  3740.   ' 2. Auslagen/Vordruck/Porto
  3741.   IF cfauslagen$<>""
  3742.     @zahlenumwandlung(5,cfauslagen$,betrag#,dummy#)
  3743.     kosten_dazusetzen(14,betrag#,"Auslagen/Porto")
  3744.   ENDIF
  3745.   ' ------------------------------
  3746.   ' 3. sonstige Auslagen
  3747.   IF cfsonstauslagenb$<>""
  3748.     @zahlenumwandlung(5,cfsonstauslagenb$,betrag#,dummy#)
  3749.     IF cfsonstauslagenn$=""
  3750.       kosten_dazusetzen(14,betrag#,"sonstige Auslagen")
  3751.     ELSE
  3752.       kosten_dazusetzen(14,betrag#,cfsonstauslagenn$)
  3753.     ENDIF
  3754.   ENDIF
  3755.   ' -------------------------
  3756.   ' Zusatzeingabendialog
  3757.   ' ---------------------------
  3758.   ' 4. Mahnkosten
  3759.   IF czmahnkosten$<>""
  3760.     @zahlenumwandlung(4,czmahnkosten$,betrag#,dummy#)
  3761.     kosten_dazusetzen(14,betrag#,"Mahnkosten")
  3762.   ENDIF
  3763.   ' ------------------------------
  3764.   ' 5. Auskünfte
  3765.   IF czauskuenfte$<>""
  3766.     @zahlenumwandlung(4,czauskuenfte$,betrag#,dummy#)
  3767.     kosten_dazusetzen(14,betrag#,"Auskünfte")
  3768.   ENDIF
  3769.   ' ------------------------------
  3770.   ' 6. Bankrücklastkosten
  3771.   IF czbankruecklast$<>""
  3772.     @zahlenumwandlung(4,czbankruecklast$,betrag#,dummy#)
  3773.     kosten_dazusetzen(14,betrag#,"Bankrückkosten")
  3774.   ENDIF
  3775.   ' ------------------------------
  3776.   ' 7. Inkassokosten
  3777.   IF czinkassokosten$<>""
  3778.     @zahlenumwandlung(4,czinkassokosten$,betrag#,dummy#)
  3779.     kosten_dazusetzen(14,betrag#,"Inkassokosten")
  3780.   ENDIF
  3781.   ' ------------------------------
  3782.   ' 8. sonstige Nebenforderungen
  3783.   IF czsonstnfdgbetr$<>""
  3784.     @zahlenumwandlung(4,czsonstnfdgbetr$,betrag#,dummy#)
  3785.     IF czsonstnfdgname$=""
  3786.       kosten_dazusetzen(14,betrag#,"Nebenforderung")
  3787.     ELSE
  3788.       kosten_dazusetzen(14,betrag#,czsonstnfdgname$)
  3789.     ENDIF
  3790.   ENDIF
  3791.   ' -------------------------
  3792. RETURN
  3793. ' **********************************************************
  3794. > PROCEDURE cmb_mahnbescheidskosten_dazubuchen
  3795.   LOCAL streitwert#,a#,b#,c#,d#
  3796.   aufstellungsaenderung#=TRUE  ! für SPEICHERN ? -Abfrage benötigt
  3797.   GOSUB freiezeilefinden(1,freiezeile%)  ! bei Zeile 1 anfangen
  3798.   '
  3799.   ' Aktuelles Datum = Buchungsdatum
  3800.   t%=VAL(LEFT$(DATE$,2))
  3801.   m%=VAL(MID$(DATE$,4,2))
  3802.   j%=VAL(RIGHT$(DATE$,2))
  3803.   GOSUB tag_absolut(t%,m%,j%,bdat%)
  3804.   '
  3805.   ' Streitwert ermitteln = Summe der Hauptforderungen
  3806.   @zahlenumwandlung(9,CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag1&)}},a#,dummy#)
  3807.   @zahlenumwandlung(9,CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag2&)}},b#,dummy#)
  3808.   @zahlenumwandlung(9,CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfbetrag3&)}},c#,dummy#)
  3809.   @zahlenumwandlung(9,CHAR{{OB_SPEC(cmbforderungbaum_adr%,cfsonstigebetrag&)}},d#,dummy#)
  3810.   streitwert#=a#+b#+c#+d#
  3811.   @gerichtskostenermittlung(streitwert#,dummy#,gk10#)  ! nur 10/10 Gebühr interessant
  3812.   ' RA-Gebühren: nur 10/10 oder 3/10 Gebühr interessant
  3813.   @gebuehrenermittlung(streitwert#,ostwestfaktor#,g3#,dummy#,dummy#,g10#,dummy#)
  3814.   ' ostwestfaktor: 1 bei Westgeb, 0.8 bei Ost, 0 bei gar keinen, Verstellung bei MB-Voreinstellungen
  3815.   ' Antragstellerzahl ermitteln
  3816.   cmb_aszahl%=0
  3817.   IF canachname1$<>""
  3818.     INC cmb_aszahl%
  3819.   ENDIF
  3820.   IF canachname2$<>""
  3821.     INC cmb_aszahl%
  3822.   ENDIF
  3823.   IF cafirmenname1$<>"" OR cafirmenname2$<>""
  3824.     INC cmb_aszahl%
  3825.   ENDIF
  3826.   cmb_aszahl%=MAX(cmb_aszahl%,1)  ! Es gibt immer mind. 1 Antragsteller
  3827.   cmb_gebuehren#=(MIN(2*g10#,(cmb_aszahl%-1)*g3#)+g10#)  ! in DM
  3828.   cmb_auslagenpv#=ROUND(0.15*cmb_gebuehren#+0.049,1)  ! auf Zehnerl aufrunden
  3829.   cmb_auslagenpv#=MIN(cmb_auslagenpv#,40)
  3830.   '
  3831.   ' Checkboxen abfragen
  3832.   cmb_mitmwst%=NOT @selected(cmbzusatzbaum_adr%,czvorsteuerabzug&)
  3833.   cmb_mwst#=ROUND(ABS(cmb_mitmwst%)*mwstsatz#/100*(cmb_gebuehren#+cmb_auslagenpv#),2)
  3834.   '
  3835.   cmb_kosten#=gk10#+cmb_gebuehren#+cmb_auslagenpv#+cmb_mwst#
  3836.   '
  3837.   IF streitwert#>0  ! nur dann auch Gebühren > 0
  3838.     ' MB-Kosten einbuchen
  3839.     fdgart#(freiezeile%)=3  ! MB-Kosten
  3840.     betrag#(freiezeile%)=cmb_kosten#
  3841.     restbetrag#(freiezeile%)=cmb_kosten#
  3842.     zinssatz#(freiezeile%)=4
  3843.     zinsdatum%(freiezeile%)=-2  ! ab Erlaß des VB
  3844.     fdgdatum%(freiezeile%)=bdat%  ! Aktuelles Datum
  3845.   ENDIF
  3846. RETURN
  3847. ' ****************************************
  3848. > PROCEDURE cmb_muster_laden(filesel%)  ! FALSE = Datei STANDARD.CMB laden
  3849.   ' Alten Pfad retten
  3850.   alt_pfad$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)
  3851.   IF filesel%=TRUE
  3852.     cmb_dateiname$=@fileselect$("CMB-Muster laden",boot_pfad$+"\PRT\MB\*.CMB","LADEN.CMB")
  3853.   ELSE
  3854.     cmb_dateiname$=boot_pfad$+"\PRT\MB\STANDARD.CMB"
  3855.   ENDIF
  3856.   IF EXIST(cmb_dateiname$)=TRUE
  3857.     OPEN "I",#1,cmb_dateiname$
  3858.   ELSE
  3859.     a$="CMB-Datei "+name_der_datei$+"|wurde nicht gefunden !|Bitte erzeugen und nochmal|probieren."
  3860.     ~@rsc_alert(1,a$," [OK ",1)
  3861.     abbruch%=TRUE
  3862.     GOTO cmb_muster_laden_ende
  3863.   ENDIF
  3864.   '
  3865.   ' ================ Antragsteller- Dialog =================================
  3866.   ' Antragsteller 1
  3867.   INPUT #1,caaz$,caanrede1$,caauslkz1$,cavorname1$,canachname1$,castrasse1$,caplz1$,caort1$,caanrede1$
  3868.   ' Antragsteller 2
  3869.   INPUT #1,caanrede2$,caauslkz2$,cavorname2$,canachname2$,castrasse2$,caplz2$,caort2$,caanrede2$
  3870.   ' Antragstellerfirma
  3871.   INPUT #1,cafirmenrechtsform$,casonstigefirma$,cafirmenname1$,cafirmenname2$,cafirmaauslkz$,cafirmenstrasse$,cafirmenplz$,cafirmenort$,cafirmenrechtsform$
  3872.   '
  3873.   ' ===== Antragstellervertreter-Dialog (NICHT: Prozeßbevollmächtigter vgl. unten) ===
  3874.   ' Erster Vertreter
  3875.   INPUT #1,casvspalte1$,casvauslkz1$,casvstellung1$,casvvornachname1$,casvstrasse1$,casvplz1$,casvort1$
  3876.   ' Zweiter Vertreter
  3877.   INPUT #1,casvspalte2$,casvauslkz2$,casvstellung2$,casvvornachname2$,casvstrasse2$,casvplz2$,casvort2$
  3878.   '
  3879.   ' ============= Antragstellerprozeßbevollmächtigter =====================
  3880.   INPUT #1,cpanrede$,cpauslagen$,cpvornachname$,cpauslkz$,cpstrasse$,cpplz$,cport$,cpblz$,cpkonto$,cpbank$
  3881.   '
  3882.   ' ======================== Antragsgegner- Dialog =========================
  3883.   ' Antragsgegner 1
  3884.   INPUT #1,cganrede1$,cgvorname1$,cgnachname1$,cgstrasse1$,cgplz1$,cgort1$,cganrede1$
  3885.   ' Antragsgegner 2
  3886.   INPUT #1,cganrede2$,cgvorname2$,cgnachname2$,cgstrasse2$,cgplz2$,cgort2$,cganrede2$
  3887.   ' Antragstellerfirma
  3888.   INPUT #1,cgfirmenrechtsform$,cgsonstigefirma$,cgfirmenname1$,cgfirmenname2$,cgfirmenstrasse$,cgfirmenplz$,cgfirmenort$,cgfirmenrechtsform$
  3889.   ' Gesamtschuldnerschaft
  3890.   INPUT #1,cggesamtschuld$
  3891.   '
  3892.   ' ======= Antragsgegnervertreter-Dialog (NICHT: Prozeßbevollmächtigter) =======
  3893.   ' Erster Vertreter
  3894.   INPUT #1,cagvspalte1$,cagvstellung1$,cagvvornachname1$,cagvstrasse1$,cagvplz1$,cagvort1$
  3895.   ' Zweiter Vertreter
  3896.   INPUT #1,cagvspalte2$,cagvstellung2$,cagvvornachname2$,cagvstrasse2$,cagvplz2$,cagvort2$
  3897.   '
  3898.   ' =========================== Forderungsdialog ============================
  3899.   ' Hauptforderungen
  3900.   INPUT #1,cfkatalognr1$,cfrechtsgrund1$,cfrechnungsnr1$,cfabdatum1$,cfbisdatum1$,cfbetrag1$
  3901.   INPUT #1,cfkatalognr2$,cfrechtsgrund2$,cfrechnungsnr2$,cfabdatum2$,cfbisdatum2$,cfbetrag2$
  3902.   INPUT #1,cfkatalognr3$,cfrechtsgrund3$,cfrechnungsnr3$,cfabdatum3$,cfbisdatum3$,cfbetrag3$
  3903.   '
  3904.   ' sonstige Rechtsgründe
  3905.   INPUT #1,cfplz$,cfort$,cfauslkz$,cfvertragsart$,cfsonstigeanspr1$,cfsonstigeanspr2$,cfsonstigebetrag$
  3906.   '
  3907.   ' Zinsen
  3908.   INPUT #1,cfzinshfzeile1$,cfnormalzins1$,cfdiskontzins1$,cfzinsturnus1$,cfzinsbasis1$,cfzinsstart1$,cfzinsende1$
  3909.   INPUT #1,cfzinshfzeile2$,cfnormalzins2$,cfdiskontzins2$,cfzinsturnus2$,cfzinsbasis2$,cfzinsstart2$,cfzinsende2$
  3910.   INPUT #1,cfzinshfzeile3$,cfnormalzins3$,cfdiskontzins3$,cfzinsturnus3$,cfzinsbasis3$,cfzinsstart3$,cfzinsende3$
  3911.   ' ---- ausgerechnete Zinsen -------
  3912.   INPUT #1,cfausgerzinsab$,cfausgerzinsbis$,cfausgerzinsbetr$
  3913.   ' ------- Auslagen ------
  3914.   INPUT #1,cfauslagen$,cfsonstauslagenb$,cfsonstauslagenn$
  3915.   '
  3916.   ' ======================== Dialog Zusatzeingaben ========================
  3917.   ' Radiobuttons + Checkboxen + Popups
  3918.   INPUT #1,czgglunabhaengig$,czgglabhaengig$,czvorsteuerabzug$,czstreitverfahrn$,czgericht$
  3919.   ' Erklärungen
  3920.   INPUT #1,czgerichtplz$,czgerichtort$,czmahngerichtplz$,czmahngerichtort$
  3921.   ' Nebenforderungen
  3922.   INPUT #1,czmahnkosten$,czauskuenfte$,czbankruecklast$,czinkassokosten$,czsonstnfdgbetr$,czsonstnfdgname$
  3923.   ' Abtretung
  3924.   INPUT #1,czaltglaeubiger$,czabtretungdatum$,czplz$,czort$,czauslkz$
  3925.   ' Verbraucherkredit
  3926.   INPUT #1,czhfzeile1$,czvertragsdatum1$,czeffektivzins1$
  3927.   INPUT #1,czhfzeile2$,czvertragsdatum2$,czeffektivzins2$
  3928.   INPUT #1,czhfzeile3$,czvertragsdatum3$,czeffektivzins3$
  3929.   '
  3930.   CLOSE #1
  3931.   '
  3932. cmb_muster_laden_ende:
  3933. RETURN
  3934. ' ***********************************************+
  3935. > PROCEDURE cmb_muster_speichern(filesel%)
  3936.   ' Alten Pfad retten
  3937.   alt_pfad$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)
  3938.   IF abbruch%=TRUE
  3939.     GOTO cmb_muster_speichern_ende
  3940.   ENDIF
  3941.   IF filesel%=TRUE
  3942.     cmb_dateiname$=@fileselect$("CMB-Muster sichern",boot_pfad$+"\PRT\MB\*.CMB","SICHERN.CMB")
  3943.   ELSE
  3944.     cmb_dateiname$=boot_pfad$+"\PRT\MB\STANDARD.CMB"
  3945.   ENDIF
  3946.   IF cmb_dateiname$="" OR RIGHT$(cmb_dateiname$)="\"
  3947.     abbruch%=TRUE
  3948.     GOTO cmb_muster_speichern_ende
  3949.   ELSE
  3950.     OPEN "O",#1,cmb_dateiname$
  3951.   ENDIF
  3952.   '
  3953.   ' ================ Antragsteller- Dialog =================================
  3954.   ' Antragsteller 1
  3955.   WRITE #1,caaz$,caanrede1$,caauslkz1$,cavorname1$,canachname1$,castrasse1$,caplz1$,caort1$,caanrede1$
  3956.   ' Antragsteller 2
  3957.   WRITE #1,caanrede2$,caauslkz2$,cavorname2$,canachname2$,castrasse2$,caplz2$,caort2$,caanrede2$
  3958.   ' Antragstellerfirma
  3959.   WRITE #1,cafirmenrechtsform$,casonstigefirma$,cafirmenname1$,cafirmenname2$,cafirmaauslkz$,cafirmenstrasse$,cafirmenplz$,cafirmenort$,cafirmenrechtsform$
  3960.   '
  3961.   ' ===== Antragstellervertreter-Dialog (NICHT: Prozeßbevollmächtigter vgl. unten) ===
  3962.   ' Erster Vertreter
  3963.   WRITE #1,casvspalte1$,casvauslkz1$,casvstellung1$,casvvornachname1$,casvstrasse1$,casvplz1$,casvort1$
  3964.   ' Zweiter Vertreter
  3965.   WRITE #1,casvspalte2$,casvauslkz2$,casvstellung2$,casvvornachname2$,casvstrasse2$,casvplz2$,casvort2$
  3966.   '
  3967.   ' ============= Antragstellerprozeßbevollmächtigter =====================
  3968.   WRITE #1,cpanrede$,cpauslagen$,cpvornachname$,cpauslkz$,cpstrasse$,cpplz$,cport$,cpblz$,cpkonto$,cpbank$
  3969.   '
  3970.   ' ======================== Antragsgegner- Dialog =========================
  3971.   ' Antragsgegner 1
  3972.   WRITE #1,cganrede1$,cgvorname1$,cgnachname1$,cgstrasse1$,cgplz1$,cgort1$,cganrede1$
  3973.   ' Antragsgegner 2
  3974.   WRITE #1,cganrede2$,cgvorname2$,cgnachname2$,cgstrasse2$,cgplz2$,cgort2$,cganrede2$
  3975.   ' Antragstellerfirma
  3976.   WRITE #1,cgfirmenrechtsform$,cgsonstigefirma$,cgfirmenname1$,cgfirmenname2$,cgfirmenstrasse$,cgfirmenplz$,cgfirmenort$,cgfirmenrechtsform$
  3977.   ' Gesamtschuldnerschaft
  3978.   WRITE #1,cggesamtschuld$
  3979.   '
  3980.   ' ======= Antragsgegnervertreter-Dialog (NICHT: Prozeßbevollmächtigter) =======
  3981.   ' Erster Vertreter
  3982.   WRITE #1,cagvspalte1$,cagvstellung1$,cagvvornachname1$,cagvstrasse1$,cagvplz1$,cagvort1$
  3983.   ' Zweiter Vertreter
  3984.   WRITE #1,cagvspalte2$,cagvstellung2$,cagvvornachname2$,cagvstrasse2$,cagvplz2$,cagvort2$
  3985.   '
  3986.   ' =========================== Forderungsdialog ============================
  3987.   ' Hauptforderungen
  3988.   WRITE #1,cfkatalognr1$,cfrechtsgrund1$,cfrechnungsnr1$,cfabdatum1$,cfbisdatum1$,cfbetrag1$
  3989.   WRITE #1,cfkatalognr2$,cfrechtsgrund2$,cfrechnungsnr2$,cfabdatum2$,cfbisdatum2$,cfbetrag2$
  3990.   WRITE #1,cfkatalognr3$,cfrechtsgrund3$,cfrechnungsnr3$,cfabdatum3$,cfbisdatum3$,cfbetrag3$
  3991.   '
  3992.   ' sonstige Rechtsgründe
  3993.   WRITE #1,cfplz$,cfort$,cfauslkz$,cfvertragsart$,cfsonstigeanspr1$,cfsonstigeanspr2$,cfsonstigebetrag$
  3994.   '
  3995.   ' Zinsen
  3996.   WRITE #1,cfzinshfzeile1$,cfnormalzins1$,cfdiskontzins1$,cfzinsturnus1$,cfzinsbasis1$,cfzinsstart1$,cfzinsende1$
  3997.   WRITE #1,cfzinshfzeile2$,cfnormalzins2$,cfdiskontzins2$,cfzinsturnus2$,cfzinsbasis2$,cfzinsstart2$,cfzinsende2$
  3998.   WRITE #1,cfzinshfzeile3$,cfnormalzins3$,cfdiskontzins3$,cfzinsturnus3$,cfzinsbasis3$,cfzinsstart3$,cfzinsende3$
  3999.   ' ---- ausgerechnete Zinsen -------
  4000.   WRITE #1,cfausgerzinsab$,cfausgerzinsbis$,cfausgerzinsbetr$
  4001.   ' ------- Auslagen ------
  4002.   WRITE #1,cfauslagen$,cfsonstauslagenb$,cfsonstauslagenn$
  4003.   '
  4004.   ' ======================== Dialog Zusatzeingaben ========================
  4005.   ' Radiobuttons + Checkboxen + Popups
  4006.   WRITE #1,czgglunabhaengig$,czgglabhaengig$,czvorsteuerabzug$,czstreitverfahrn$,czgericht$
  4007.   ' Erklärungen
  4008.   WRITE #1,czgerichtplz$,czgerichtort$,czmahngerichtplz$,czmahngerichtort$
  4009.   ' Nebenforderungen
  4010.   WRITE #1,czmahnkosten$,czauskuenfte$,czbankruecklast$,czinkassokosten$,czsonstnfdgbetr$,czsonstnfdgname$
  4011.   ' Abtretung
  4012.   WRITE #1,czaltglaeubiger$,czabtretungdatum$,czplz$,czort$,czauslkz$
  4013.   ' Verbraucherkredit
  4014.   WRITE #1,czhfzeile1$,czvertragsdatum1$,czeffektivzins1$
  4015.   WRITE #1,czhfzeile2$,czvertragsdatum2$,czeffektivzins2$
  4016.   WRITE #1,czhfzeile3$,czvertragsdatum3$,czeffektivzins3$
  4017.   '
  4018.   CLOSE #1
  4019.   '
  4020. cmb_muster_speichern_ende:
  4021.   CHDIR alt_pfad$  ! Zurück zum alten Pfad
  4022. RETURN
  4023. ' **********************************************+
  4024. '
  4025. '
  4026. '
  4027. ' ============================================================
  4028. ' PROGRAMME FÜR DEN TERMINKALENDER
  4029. ' =============================================================
  4030. ' *****************************************************+
  4031. > PROCEDURE termine_zeigen
  4032.   WHILE i%>=0
  4033.     INPUT "DATENSATZNR=? ",i%
  4034.     EXIT IF i%<1
  4035.     GET #2,i%
  4036.     EXIT IF EOF(#2)=TRUE
  4037.     PRINT termdat$
  4038.     PRINT termuhr$
  4039.     PRINT termart$
  4040.     PRINT saal$
  4041.     PRINT termort$
  4042.     PRINT insachen$
  4043.     PRINT termende$
  4044.     PRINT endzeit$
  4045.     PRINT
  4046.   WEND
  4047. RETURN
  4048. ' *********************************************************************
  4049. > PROCEDURE termine_laden  ! LÄDT DIE INFOS UND ÖFFNET DIE DATEI
  4050.   '                      ! EINZELNE DATENSÄTZE MIT DATENSATZ_LADEN
  4051.   termineladenabbruch%=FALSE
  4052.   ' PFADBESTIMMUNG
  4053.   pfad#=GEMDOS(25)+65
  4054.   pfad$=boot_pfad$+"\TERMINE\*.TER"
  4055.   terminsdateiname$=@fileselect$("Termindatei laden",pfad$,"GELD_HER.TER")
  4056.   ' ABBRUCH GEWÄHLT
  4057.   IF terminsdateiname$="" OR RIGHT$(terminsdateiname$)="\"
  4058.     termineladenabbruch%=TRUE
  4059.     GOTO termineladenende
  4060.   ENDIF
  4061.   ' WENN EFFEKTIV GELADEN WIRD, FELD T() VORBEREITEN
  4062.   ERASE t#()  ! Feld leeren
  4063.   DIM t#(1500)
  4064.   ' DATEI ÖFFNEN, LÄNGE BESTIMMEN
  4065.   IF EXIST(terminsdateiname$)
  4066.     OPEN "R",#2,terminsdateiname$,105  ! Satzlänge
  4067.     datensaetze%=INT(LOF(#2)/105)
  4068.     ' BEIM LADEN LIEGT IMMER DIE SORTIERTE REIHENFOLGE VOR
  4069.     IF datensaetze%=0
  4070.       dummy%=@rsc_alert(1,"Keine Termine vorhanden !","[OK",1)
  4071.       GOTO termineladenende
  4072.     ENDIF
  4073.     FOR i%=1 TO datensaetze%  ! ALSO T() MIT DEN INDICES FÜLLEN (-1 WG. INFOS)
  4074.       t#(i%)=i%
  4075.     NEXT i%
  4076.     FIELD #2,6 AS termdat$,4 AS termuhr$,1 AS terminsart$,6 AS saal$,35 AS termort$,43 AS insachen$,6 AS termende$,4 AS endzeit$
  4077.     GET #2,datensaetze%  ! LETZTEN Datensatz lesen. Er enthält (hoffentlich):
  4078.     '           letztes Bearbeitungsdatum, Zahl der Kollisionen, RA-Name usw
  4079.     ra_listenname$=sache$
  4080.   ELSE
  4081.     dummy%=@rsc_alert(1,"Die gewählte Datei|existiert nicht !","[Abbruch",1)
  4082.     termineladenabbruch%=TRUE
  4083.   ENDIF
  4084.   DEFMOUSE 0
  4085. termineladenende:
  4086.   GOSUB termine_zeigen
  4087. RETURN
  4088. ' *************************************************************************
  4089. > PROCEDURE termine_speichern
  4090.   terminespeichernabbruch%=FALSE
  4091.   pfad#=GEMDOS(25)+65
  4092.   pfad$=boot_pfad$+"\TERMINE\*.TER"
  4093.   terminsdateiname$=@fileselect$("Termindatei sichern",pfad$,"GELD_HER.TER")
  4094.   IF terminsdateiname$="" OR RIGHT$(terminsdateiname$)="\"  ! entspr. ABBRUCH
  4095.     terminspeichernabbruch%=TRUE
  4096.     GOTO terminspeichernende
  4097.   ELSE
  4098.     terminsaenderung#=FALSE  ! da ja gespeichert wird mit Änderungen
  4099.     DEFMOUSE 2
  4100.     '    OPEN "R",#2,terminsdateiname$,250  ! ist schon offen
  4101.     sache$=ra_listenname$  ! Name des RA für den die liste ist
  4102.     '   FIELD #2,6 AS termdat$,4 AS termuhr$,1 AS terminsart$,6 AS saal$,35 AS termort$,43 AS insachen$,6 AS termende$,4 AS endzeit$
  4103.     PUT #2,1  ! Ersten Datensatz schreiben. Er enthält (hoffentlich):
  4104.     '           letztes Bearbeitungsdatum, Zahl der Kollisionen, RA-Name usw
  4105.     ' HIER WEITERE DATENSÄTZE PUTTEN
  4106.   ENDIF
  4107.   TOUCH #2  ! Datum der Datei aktualisieren
  4108. terminspeichernende:
  4109. RETURN
  4110. ' *******************************************************************++
  4111. > PROCEDURE termine_eingeben
  4112. anfang_termine_eingeben:
  4113.   termeingbaum_adr%=rsc_adr%(termeingbaum&)
  4114.   @dialog_positionieren(termeingbaum&)
  4115.   ' +++++++++  FELDER LEEREN  +++++++++++
  4116.   CHAR{{OB_SPEC(termeingbaum_adr%,termdat&)}}=""
  4117.   CHAR{{OB_SPEC(termeingbaum_adr%,termuhr&)}}=""
  4118.   CHAR{{OB_SPEC(termeingbaum_adr%,saal&)}}=""
  4119.   CHAR{{OB_SPEC(termeingbaum_adr%,insachen&)}}=""
  4120.   CHAR{{OB_SPEC(termeingbaum_adr%,termort&)}}=""
  4121.   CHAR{{OB_SPEC(termeingbaum_adr%,termende&)}}=""
  4122.   CHAR{{OB_SPEC(termeingbaum_adr%,endzeit&)}}=""
  4123.   ' +++++++++++++ BUTTONS VORWÄHLEN ++++++++++++++++++
  4124.   @select(termeingbaum_adr%,pktl&,TRUE)
  4125.   @select(termeingbaum_adr%,sat&,FALSE)
  4126.   @select(termeingbaum_adr%,priv&,FALSE)
  4127.   @select(termeingbaum_adr%,min15&,FALSE)
  4128.   @select(termeingbaum_adr%,min30&,FALSE)
  4129.   @select(termeingbaum_adr%,min45&,FALSE)
  4130.   @select(termeingbaum_adr%,min60&,FALSE)
  4131.   @select(termeingbaum_adr%,min90&,FALSE)
  4132.   '
  4133.   ' Vorbereitung des Dialogs
  4134.   @rsc_draw(termeingbaum&,fensterdial%)
  4135.   erstes_objekt%=termdat&
  4136.   '
  4137. daten_einstellen:
  4138.   ' Duchführen des Dialogs
  4139.   ex_obj%=@rsc_do(termeingbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  4140.   '
  4141.   SELECT ex_obj%
  4142.   CASE min15&,min30&,min45&,min60&,min90&
  4143.     ' EINSTELLEN DER ENDZEIT NACH ANGEKLICKTEM BUTTON
  4144.     SELECT ex_obj%
  4145.     CASE min15&
  4146.       dauer%=15
  4147.     CASE min30&
  4148.       dauer%=30
  4149.     CASE min45&
  4150.       dauer%=45
  4151.     CASE min60&
  4152.       dauer%=60
  4153.     CASE min90&
  4154.       dauer%=90
  4155.     ENDSELECT
  4156.     termdat$=CHAR{{OB_SPEC(termeingbaum_adr%,termdat&)}}
  4157.     termuhr$=CHAR{{OB_SPEC(termeingbaum_adr%,termuhr&)}}
  4158.     GOSUB zeit_addieren(termdat$,termuhr$,dauer%,termende$,endzeit$)
  4159.     CHAR{{OB_SPEC(termeingbaum_adr%,termende&)}}=termende$
  4160.     CHAR{{OB_SPEC(termeingbaum_adr%,endzeit&)}}=endzeit$
  4161.     GOSUB objc_update(termeingbaum_adr%,endzeit&)
  4162.     GOSUB objc_update(termeingbaum_adr%,termende&)
  4163.     GOTO daten_einstellen
  4164.   CASE abbruc21&  ! ABBRUCHBUTTON ANGEKLICKT >>> DIALOGENDE
  4165.     ' Beenden des Dialogs
  4166.     rsc_back(termeingbaum&)
  4167.     @select(termeingbaum_adr%,ex_obj%,FALSE)
  4168.     ' Dialog beendet
  4169.   CASE fertig21& ! DATEN ÜBERNEHMEN UND KEINE WEITERE EINGABEN MACHEN
  4170.     ' Beenden des Dialogs
  4171.     rsc_back(termeingbaum&)
  4172.     @select(termeingbaum_adr%,ex_obj%,FALSE)
  4173.     ' Dialog beendet
  4174.     GOSUB termindaten_auslesen
  4175.     GOSUB termin_einfuegen
  4176.   CASE weiter&  ! DATEN ÜBERNEHMEN UND WEITERE EINGABEN MACHEN
  4177.     ' BOX BLEIBT GEÖFFNET, EINGABEFELDER WERDEN GELÖSCHT
  4178.     @select(termeingbaum_adr%,ex_obj%,FALSE)
  4179.     GOSUB termindaten_auslesen
  4180.     GOSUB termin_einfuegen
  4181.     GOTO anfang_termine_eingeben
  4182.   ENDSELECT
  4183. RETURN
  4184. ' ****************************************************************
  4185. > PROCEDURE termine_selektieren
  4186.   termwahlbaum_adr%=rsc_adr%(termwahlbaum&)
  4187.   @dialog_positionieren(termwahlbaum&)
  4188.   flag%=0  ! TEXT BLEIBT NICHT STEHEN
  4189.   ' +++++++++  VORBELEGUNG der ADRESSFELDER +++++++++++
  4190.   CHAR{{OB_SPEC(termwahlbaum_adr%,abtermin&)}}=""
  4191.   CHAR{{OB_SPEC(termwahlbaum_adr%,bistermn&)}}=""
  4192.   IF abtermin$=""  ! VOREINSTELLUNG BEGINN DER TERMINSLISTE
  4193.     abtermin$=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  4194.   ENDIF
  4195.   IF bistermn$=""  ! VOREINSTELLUNG ENDE DER TERMINSLISTE
  4196.     bistermn$="311249"  !  BIS 31.12.2049 VORBEREITET
  4197.   ENDIF
  4198.   ' Vorbereitung des Dialogs
  4199.   @rsc_draw(termwahlbaum&,fensterdial%)
  4200. einsetzen_der_daten:
  4201.   CHAR{{OB_SPEC(termwahlbaum_adr%,abtermin&)}}=abtermin$
  4202.   GOSUB objc_update(termwahlbaum_adr%,abtermin&)
  4203.   CHAR{{OB_SPEC(termwahlbaum_adr%,bistermn&)}}=bistermn$
  4204.   GOSUB objc_update(termwahlbaum_adr%,bistermn&)
  4205.   '
  4206.   ' Duchführen des Dialogs
  4207.   ex_obj%=@rsc_do(termwahlbaum&,abtermin&,dummy&)  ! dummy, da kein Popupmenu in der Box
  4208.   ' +++++++++++
  4209.   SELECT ex_obj%
  4210.   CASE heute&
  4211.     abtermin$=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  4212.     bistermn$=abtermin$
  4213.     GOTO einsetzen_der_daten
  4214.   CASE morgen&
  4215.     GOSUB datum_aufspalten(DATE$,t1%,m1%,j1%)
  4216.     GOSUB datums_addition(t1%,m1%,j1%,1,nt%,nm%,nj%)
  4217.     GOSUB datumsstring_erstellen(nt%,nm%,nj%,1,abtermin$)
  4218.     bistermn$=abtermin$
  4219.     GOTO einsetzen_der_daten
  4220.   CASE aktwoche&  ! Woche geht, anders als kalendarisch von Mo-So
  4221.     abtermin$=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2) ! = heute
  4222.     GOSUB datum_aufspalten(DATE$,t1%,m1%,j1%)
  4223.     GOSUB welcher_wochentag(t1%,m1%,j1%,dummy$,wochentagsnr%)
  4224.     IF wochentagsnr%=0
  4225.       rest_der_woche%=0  ! letzter Tag der Woche (So)
  4226.     ELSE
  4227.       rest_der_woche%=7-wochentagsnr%
  4228.     ENDIF
  4229.     GOSUB datums_addition(t1%,m1%,j1%,rest_der_woche%,nt%,nm%,nj%)
  4230.     GOSUB datumsstring_erstellen(nt%,nm%,nj%,1,bistermn$)
  4231.     GOTO einsetzen_der_daten
  4232.   CASE nxtwoche&  ! Woche geht, anders als kalendarisch von Mo-So
  4233.     GOSUB datum_aufspalten(DATE$,t1%,m1%,j1%)
  4234.     GOSUB welcher_wochentag(t1%,m1%,j1%,dummy$,wochentagsnr%)
  4235.     IF wochentagsnr%=0
  4236.       wochentagsnr%=7  ! WEIL HIER WOCHE AM MONTAG BEGINNT
  4237.     ENDIF
  4238.     erster_tag%=8-wochentagsnr%
  4239.     GOSUB datums_addition(t1%,m1%,j1%,erster_tag%,nt%,nm%,nj%)
  4240.     GOSUB datumsstring_erstellen(nt%,nm%,nj%,1,abtermin$)
  4241.     GOSUB datums_addition(nt%,nm%,nj%,6,t1%,m1%,j1%)
  4242.     GOSUB datumsstring_erstellen(t1%,m1%,j1%,1,bistermn$)
  4243.     GOTO einsetzen_der_daten
  4244.   CASE aktmonat&
  4245.     abtermin$=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  4246.     monat%=VAL(MID$(DATE$,4,2))
  4247.     SELECT monat%
  4248.     CASE 1,3,5,7,8,10,12
  4249.       tage%=31
  4250.     CASE 4,6,9,11
  4251.       tage%=30
  4252.     CASE 2  !Februar
  4253.       tage%=28
  4254.       jahr%=VAL(RIGHT$(DATE$,2))
  4255.       IF jahr% MOD 4=0  ! ohne Rest durch 4 teilbar
  4256.         INC tage%                        ! 29.2. bei Schaltjahr addieren
  4257.       ENDIF
  4258.     ENDSELECT
  4259.     bistermn$=STR$(tage%)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  4260.     GOTO einsetzen_der_daten
  4261.   CASE nxtmonat&
  4262.     tag%=1
  4263.     monat%=VAL(MID$(DATE$,4,2))+1
  4264.     jahr%=VAL(RIGHT$(DATE$,2))
  4265.     IF monat%=13  ! Jahreswechsel
  4266.       monat%=1
  4267.       INC jahr%
  4268.     ENDIF
  4269.     GOSUB datumsstring_erstellen(tag%,monat%,jahr%,1,abtermin$)
  4270.     '
  4271.     SELECT monat%
  4272.     CASE 1,3,5,7,8,10,12
  4273.       tag%=31
  4274.     CASE 4,6,9,11
  4275.       tag%=30
  4276.     CASE 2  !Februar
  4277.       tag%=28
  4278.       jahr%=VAL(RIGHT$(DATE$,2))
  4279.       IF jahr% MOD 4=0  ! ohne Rest durch 4 teilbar
  4280.         INC tag%                        ! 29.2. bei Schaltjahr addieren
  4281.       ENDIF
  4282.     ENDSELECT
  4283.     GOSUB datumsstring_erstellen(tag%,monat%,jahr%,1,bistermn$)
  4284.     GOTO einsetzen_der_daten
  4285.   CASE aktjahr&
  4286.     abtermin$=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  4287.     bistermn$="3112"+RIGHT$(DATE$,2)
  4288.     GOTO einsetzen_der_daten
  4289.   CASE alle&
  4290.     abtermin$=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  4291.     bistermn$="311249"
  4292.     GOTO einsetzen_der_daten
  4293.   DEFAULT
  4294.     abtermin$=CHAR{{OB_SPEC(termwahlbaum_adr%,abtermin&)}}
  4295.     GOSUB datumsumwandlung(abtermin$,abtermin%,dummy%)
  4296.     bistermin$=CHAR{{OB_SPEC(termwahlbaum_adr%,bistermn&)}}
  4297.     GOSUB datumsumwandlung(bistermin$,bistermin%,dummy%)
  4298.     IF abtermin%>bistermin% AND ex_obj%=fertig20&
  4299.       dummy%=@rsc_alert(1,"Unsinniger Zeitraum|ausgewählt !"," OK ",1)
  4300.     ENDIF
  4301.     @select(termwahlbaum_adr%,ex_obj%,FALSE)
  4302.     GOSUB objc_update(termwahlbaum_adr%,ex_obj%)
  4303.   ENDSELECT
  4304.   '
  4305.   ' Beenden des Dialogs
  4306.   rsc_back(termwahlbaum&)
  4307.   @select(termwahlbaum_adr%,ex_obj%,FALSE)
  4308.   ' Dialog beendet
  4309. RETURN
  4310. ' ******************************************************************+
  4311. > PROCEDURE termin_einfuegen  ! wird immer hinten an die Datei angehängt
  4312.   '                           da die Variablennamen global sind,
  4313.   '                           müssen sie nicht übergeben werden
  4314.   GOSUB terminsanzahl_ermitteln(1,anzahl%)
  4315.   PUT #2,anzahl%+1  ! hinten anhängen
  4316.   ' Ermittlung, der wievielte Termin es ist und Feld t() aktualisieren
  4317.   GOSUB datumsumwandlung(termdat$,vergleichstag1%,dummy%)
  4318.   vergleichszeit$=termuhr$
  4319.   FOR i%=2 TO anzahl%
  4320.     GET #2,i%
  4321.     GOSUB datumsumwandlung(termdat$,vergleichstag2%,dummy%)
  4322.     GOSUB datums_rueckumwandlung(vergleichstag2%,vt2%,vm2%,vj2%)
  4323.     GOSUB daten_differenz(vt1%,vm1%,vj1%,vt2%,vm2%,vj2%,unterschied%)
  4324.     IF unterschied%=0  ! gleiches Datum
  4325.       IF VAL(termuhr$)>VAL(vergleichszeit$)  ! d.h. das gelesene Datum/Zeit
  4326.         '                                    ! liegt nach dem neuen Datensatz
  4327.         INSERT t#(i%)=anzahl%+1  ! d.h. der angehängte Datensatz hat im
  4328.         '                       ! Feld t() den Index i%
  4329.       ENDIF
  4330.     ELSE IF unterschied%>0  ! d.h. das zweite Datum liegt nach dem ersten
  4331.       '                     ! Also das neue vorher einfügen
  4332.       INSERT t#(i%)=anzahl%+1  ! d.h. der angehängte Datensatz hat im
  4333.       '                       ! Feld t() den Index i%
  4334.     ENDIF
  4335.   NEXT i%
  4336. RETURN
  4337. ' ************************************************************
  4338. > PROCEDURE terminsanzahl_ermitteln(startzeile%,VAR zahl%)
  4339.   DO
  4340.     EXIT IF t#(startzeile%)=0
  4341.     INC startzeile%
  4342.   LOOP
  4343.   zahl%=startzeile%-1
  4344. RETURN
  4345. ' ****************************************************************
  4346. > PROCEDURE termindaten_auslesen ! wird nur bei Baum termineingaben
  4347.   '                             ! nur Globale Variablen, keine Übergabe
  4348.   ez$=CHAR{{OB_SPEC(termeingbaum_adr%,endzeit&)}}
  4349.   LSET endzeit$=ez$
  4350.   te$=CHAR{{OB_SPEC(termeingbaum_adr%,termende&)}}
  4351.   LSET termende$=te$
  4352.   tu$=CHAR{{OB_SPEC(termeingbaum_adr%,termuhr&)}}
  4353.   LSET termuhr$=tu$
  4354.   td$=CHAR{{OB_SPEC(termeingbaum_adr%,termdat&)}}
  4355.   LSET termdat$=td$
  4356.   sa$=CHAR{{OB_SPEC(termeingbaum_adr%,saal&)}}
  4357.   LSET saal$=sa$
  4358.   to$=CHAR{{OB_SPEC(termeingbaum_adr%,termort&)}}
  4359.   LSET termort$=to$
  4360.   is$=CHAR{{OB_SPEC(termeingbaum_adr%,insachen&)}}
  4361.   LSET insachen$=is$
  4362.   ' ABFRAGE DER BUTTONS SAMMELTERMIN/PRIVAT USW. (TERMINSART)
  4363.   GOSUB is_objc(termeingbaum_adr%,sat&,1,*erg%)
  4364.   IF erg%=1
  4365.     terminsart$="1"
  4366.   ENDIF
  4367.   GOSUB is_objc(termeingbaum_adr%,pktl&,1,*erg%)
  4368.   IF erg%=1
  4369.     terminsart$="2"
  4370.   ENDIF
  4371.   GOSUB is_objc(termeingbaum_adr%,priv&,1,*erg%)
  4372.   IF erg%=1
  4373.     terminsart$="3"
  4374.   ENDIF
  4375. RETURN
  4376. ' *******************************************************************
  4377. '
  4378. ' ====================================================================
  4379. ' DATUMSPROGRAMME
  4380. ' ======================================================================
  4381. ' ****************************************************************
  4382. > PROCEDURE tag_im_jahr(tag%,monat%,jahr%,VAR tagesnr%)   ! Der wievielte Tag im Jahr ist heute ?
  4383.   IF m%>2
  4384.     tagesnr%=INT((monat%+1)*30.6)-63+tag%
  4385.     IF jahr% MOD 4=0
  4386.       INC tagesnr%                        ! 29.2. bei Schaltjahr addieren
  4387.     ENDIF
  4388.   ELSE
  4389.     tagesnr%=INT((monat%+13)*30.6)-428+tag%
  4390.   ENDIF
  4391. RETURN
  4392. ' ******************************************************************
  4393. > PROCEDURE tag_absolut(tag%,monat%,jahr%,VAR tageszahl%)  ! Der wievielte Tag ist absolut ?
  4394.   SELECT jahr%
  4395.   CASE 0  ! Wenn kein Datum eingetragen wurde oder Jahr 2000
  4396.     IF monat%>0 AND tag%>0
  4397.       ADD jahr%,2000
  4398.     ENDIF
  4399.   CASE 1 TO 49
  4400.     ADD jahr%,2000
  4401.   CASE 50 TO 99   ! Wenn jahr% zweistellig ist, die Jahrhunderte addieren
  4402.     ADD jahr%,1900
  4403.   ENDSELECT
  4404.   IF monat%>2                     ! Zahlen ? (gerechnet ab 1.3.0000)
  4405.     SUB monat%,3
  4406.   ELSE
  4407.     ADD monat%,9
  4408.     DEC jahr%
  4409.   ENDIF
  4410.   jahrhundert%=jahr%/100  ! ist automatisch nur der ganzzahlige Anteil
  4411.   jahre_im_aktuellen_jahrhundert%=jahr%-100*jahrhundert%
  4412.   tageszahl%=INT(146097*jahrhundert%/4)+INT(1461*jahre_im_aktuellen_jahrhundert%/4)+INT((153*monat%+2)/5)+tag%
  4413.   IF tag%=0
  4414.     tageszahl%=0  ! Wenn nichts eingetragen war, muß Datum =0 sein
  4415.   ENDIF
  4416. RETURN
  4417. ' *****************************************************************
  4418. > PROCEDURE datums_rueckumwandlung(tagesnr%,VAR tag%,monat%,jahr%) ! Rechnet absolutes Datum wieder zurück
  4419.   jahr%=(4*tagesnr%-1)/146097
  4420.   tagesnr%=4*tagesnr%-146097*jahr%-1
  4421.   tag%=tagesnr%/4
  4422.   tagesnr%=(tag%*4+3)/1461
  4423.   tag%=4*tag%+3-1461*tagesnr%
  4424.   tag%=(tag%+4)/4
  4425.   monat%=(5*tag%-3)/153
  4426.   tag%=((5*tag%-3-153*monat%)+5)/5
  4427.   jahr%=100*jahr%+tagesnr%
  4428.   IF monat%<10
  4429.     ADD monat%,3
  4430.   ELSE
  4431.     SUB monat%,9
  4432.     INC jahr%
  4433.   ENDIF
  4434. RETURN
  4435. ' ******************************************************************
  4436. > PROCEDURE welcher_wochentag(tag%,monat%,jahr%,VAR wtname$,wochentag%)    ! Welcher Wochentag ist ?
  4437.   IF einlesen%=FALSE
  4438.     DIM namen$(6)
  4439.     RESTORE tagesnamen
  4440.   tagesnamen:
  4441.     DATA Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag
  4442.     FOR i%=0 TO 6
  4443.       READ namen$(i%)
  4444.     NEXT i%
  4445.     einlesen%=TRUE  ! also nächstes mal nicht mehr einlesen
  4446.   ENDIF
  4447.   GOSUB tag_absolut(tag%,monat%,jahr%,tageszahl%)
  4448.   ' 1.1.1950 war der 712164. Tag absolut und ein Sonntag
  4449.   wochentag%=(tageszahl%-712164)-INT((tageszahl%-712164)/7)*7 ! In Relation zu 1.1.1950
  4450.   wtname$=namen$(wochentag%)  ! Achtung, es wird Adresse eines Strings übergeben
  4451.   ' wochentag% = Nr. des Wochentags (0 bis 6)
  4452. RETURN
  4453. ' **********************************************************************
  4454. > PROCEDURE zeit_addieren(anfangsdat$,anfangszeit$,differenz%,VAR rueckdatum$,neue_zeit$)
  4455.   stunden%=VAL(LEFT$(anfangszeit$,2))
  4456.   minuten%=VAL(RIGHT$(anfangszeit$,2))
  4457.   ADD minuten%,differenz%  ! NEUE ZEIT
  4458.   stunden%=stunden%+INT(minuten%/60)  ! FALLS VOLLE STUNDE ÜBERSCHRITTEN
  4459.   IF stunden%>23  ! FALLS 24.00 ÜBERSCHRITTEN
  4460.     SUB stunden%,24
  4461.     ' ENDDATUM ANPASSEN
  4462.     GOSUB datumsumwandlung(anfangsdat$,rueckdatum%,dummy%)
  4463.     GOSUB datums_rueckumwandlung(rueckdatum%,t%,m%,j%)
  4464.     GOSUB datums_addition(t%,m%,j%,1,nt%,nm%,nj%)
  4465.     GOSUB datumsstring_erstellen(nt%,nm%,nj%,1,rueckdatum$)
  4466.   ELSE
  4467.     rueckdatum$=anfangsdat$
  4468.   ENDIF
  4469.   minuten%=minuten%-INT(minuten%/60)*60
  4470.   minuten$=STR$(minuten%,2)
  4471.   WHILE INSTR(minuten$," ")<>0
  4472.     lzpos%=INSTR(minuten$," ")
  4473.     minuten$=LEFT$(minuten$,lzpos%-1)+"0"+MID$(minuten$,lzpos%+1)
  4474.   WEND
  4475.   neue_zeit$=STR$(stunden%,2)+minuten$
  4476. RETURN
  4477. ' **********************************************************************
  4478. > PROCEDURE datums_addition(tag1%,monat1%,jahr1%,differenz%,VAR t2%,m2%,j2%)
  4479.   ' eine Anzahl von Tagen wird zu einem Datum addiert, Rückgabe ist das neue Datum
  4480.   SELECT jahr1%
  4481.   CASE 0 TO 49
  4482.     ADD jahr1%,2000
  4483.   CASE 50 TO 99
  4484.     ADD jahr1%,1900
  4485.   ENDSELECT
  4486.   GOSUB tag_absolut(tag1%,monat1%,jahr1%,tagesnr%)
  4487.   ADD tagesnr%,differenz%
  4488.   GOSUB datums_rueckumwandlung(tagesnr%,t2%,m2%,j2%)
  4489. RETURN
  4490. ' *****************************************************************
  4491. > PROCEDURE daten_differenz(tag1%,monat1%,jahr1%,tag2%,monat2%,jahr2%,VAR differenz%)
  4492.   ' Zuerst das frühere Datum übergeben, dann das spätere
  4493.   ' ACHTUNG, NICHT FÜR ZINSDATEN GEEIGNET, da nicht nach Zinsdaten
  4494.   ' sondern absolut gerechnet wird.
  4495.   GOSUB tag_absolut(tag1%,monat1%,jahr1%,tageszahl1%)
  4496.   GOSUB tag_absolut(tag2%,monat2%,jahr2%,tageszahl2%)
  4497.   differenz%=(tageszahl2%-tageszahl1%)
  4498. RETURN
  4499. ' **********************************************************************
  4500. > PROCEDURE datumsumwandlung(originaldatum$,VAR rueckgabedatum%,error%)  !>> ABSOLUT
  4501.   ' WANDELT EIN DATUM WELCHES AUS DER DIALOGBOX GELESEN WURDE (TTMMJJ)
  4502.   ' UM IN EIN ABSOLUTES DATUM UM
  4503.   LOCAL t%,m%,j%
  4504.   t%=VAL(LEFT$(originaldatum$,2))
  4505.   m%=VAL(MID$(originaldatum$,3,2))
  4506.   j%=VAL(RIGHT$(originaldatum$,2))
  4507.   SELECT j%  ! JAHRE VOR BZW. NACH JAHRTAUSENDWENDE VIERSTELLIG ERZEUGEN
  4508.   CASE 0  ! Wenn kein Datum eingetragen wurde oder Jahr 2000
  4509.     IF m%>0 AND t%>0
  4510.       ADD j%,2000
  4511.     ENDIF
  4512.   CASE 1 TO 49
  4513.   CASE 50 TO 99
  4514.     ADD j%,1900
  4515.   ENDSELECT
  4516.   IF t%>31 OR t%<1 OR m%>12 OR m%<1
  4517.     error%=1
  4518.   ELSE
  4519.     error%=0
  4520.   ENDIF
  4521.   GOSUB tag_absolut(t%,m%,j%,rueckgabedatum%)
  4522. RETURN
  4523. ' *********************************************************************
  4524. > PROCEDURE datum_aufspalten(originaldatum$,VAR t0%,m0%,j0%)  ! tt.mm.jj>>T,M,J
  4525.   t0%=VAL(originaldatum$)  ! Hört beim 1. Punkt auf
  4526.   pktpos%=INSTR(originaldatum$,".")
  4527.   originaldatum$=MID$(originaldatum$,pktpos%+1)  ! Ab dem Monat abschneiden
  4528.   m0%=VAL(originaldatum$)  ! Hört beim Punkt auf
  4529.   pktpos%=INSTR(originaldatum$,".")
  4530.   originaldatum$=MID$(originaldatum$,pktpos%+1)  ! Ab dem 2. Punkt abschneiden
  4531.   j0%=VAL(originaldatum$)  ! Rest ist die Jahreszahl
  4532.   SELECT j0%
  4533.   CASE 0 TO 49  ! Anpassung an Jahrtausendwechsel
  4534.     ADD j0%,2000
  4535.   CASE 50 TO 99
  4536.     ADD j0%,1900
  4537.   ENDSELECT
  4538. RETURN
  4539. ' ******************************************************************
  4540. > PROCEDURE datumsstring_erstellen(t%,m%,j%,modus%,VAR rueckgabedatum$) !>> TTMMJJ
  4541.   ' Wandelt ein Datum das nach tagen, monaten und Jahren (Zahlenwerte)
  4542.   ' übergeben wird in ein Datum um, das direkt in die Dialogbox paßt(MODUS%=1)
  4543.   ' oder Klartext mit Punkten (MODUS%=2)
  4544.   SELECT modus%
  4545.   CASE 1
  4546.     rueckgabedatum$=STR$(t%,2)+STR$(m%,2)+RIGHT$(STR$(j%,4),2)  !wg. vierstelligen Jahren
  4547.   CASE 2
  4548.     rueckgabedatum$=STR$(t%,2)+"."+STR$(m%,2)+"."+RIGHT$(STR$(j%,4),2)  !wg. vierstelligen Jahren
  4549.   ENDSELECT
  4550.   ' Leerzeichen durch Nullen ersetzen
  4551.   WHILE INSTR(rueckgabedatum$," ")<>0
  4552.     lzpos%=INSTR(rueckgabedatum$," ")
  4553.     rueckgabedatum$=LEFT$(rueckgabedatum$,lzpos%-1)+"0"+MID$(rueckgabedatum$,lzpos%+1)
  4554.   WEND
  4555. RETURN
  4556. ' **********************************************************************
  4557. > PROCEDURE zinstage(anfangsdatum%,enddatum%,VAR zt%)  ! Absolute Daten
  4558.   ' DATUM MUSS ABSOLUT ÜBERGEBEN WERDEN
  4559.   LOCAL at%,am%,aj%,et%,em%,ej%
  4560.   IF anfangsdatum%<=0 ! Zinsen ab Zustellung oder ab VB-Erlaß
  4561.     ' Dann Zinsen ab Zustellung oder VB-Erlaß, deren Datum noch nicht
  4562.     ' feststeht, also zinstage = 0 damit Zinsen null werden
  4563.     zt%=0
  4564.   ELSE  ! Normaler Zinsanfang
  4565.     GOSUB datums_rueckumwandlung(anfangsdatum%,at%,am%,aj%)
  4566.     GOSUB datums_rueckumwandlung(enddatum%,et%,em%,ej%)
  4567.     ' (JAHR KOMMT  VIERSTELLIG ZURÜCK)
  4568.     at%=MIN(at%,30)  ! maximal 30 Zinstage/Monat
  4569.     et%=MIN(et%,30)  ! maximal 30 Zinstage/Monat
  4570.     zt%=(et%-at%)+(em%-am%)*30+(ej%-aj%)*360
  4571.     zt%=MAX(zt%,0)  ! negative Zinstage gibts nicht
  4572.   ENDIF
  4573. RETURN
  4574. ' ******************************************************************
  4575. '
  4576. ' ======================================================================
  4577. ' FORDERUNGSBERECHNUNG NACH § 367 BGB
  4578. ' ===================================================================
  4579. '
  4580. ' DATENEINGABE UND SONSTIGES
  4581. '
  4582. ' ********************************************************************
  4583. > PROCEDURE abr367
  4584.   IF abbruch%=TRUE
  4585.     GOTO abr367_ende
  4586.   ENDIF
  4587.   es_muss_nach_daten_sortiert_werden%=FALSE
  4588.   ' letztes Datum finden
  4589.   GOSUB freiezeilefinden(1,freiezeile%)
  4590.   IF freiezeile%>1
  4591.     datum_der_letzten_buchung%=fdgdatum%(freiezeile%-2) !da letzte Zeile=Ergebnis
  4592.   ENDIF
  4593.   DEFMOUSE 0
  4594.   buchungsbaum_adr%=rsc_adr%(buchungsbaum&)
  4595.   @dialog_positionieren(buchungsbaum&)
  4596.   GOSUB freiezeilefinden(1,freiezeile%)  ! bei Zeile 1 mit der Suche beginnen
  4597.   GOSUB altergebniszeileloeschen(freiezeile%)
  4598. anfang367:   ! SPRUNGMARKE FÜR WEITERBUCHEN
  4599.   GOSUB 367eingaben(exitobjekt%,fdgart%,fdgname$,fdgbetrag#,zinsensatz#,zinsdatum%,forderungsdatum%,gebuchtezeile%)
  4600.   IF exitobjekt%<>abbruch&  ! also <>ABBRUCH
  4601.     aufstellungsaenderung#=TRUE
  4602.     '
  4603.     ' 1.:Fallunterscheidungen: Neue Zeile oder editierte Zeile
  4604.     GOSUB freiezeilefinden(1,freiezeile%)
  4605.     IF gebuchtezeile%=freiezeile% ! DANN NEUBUCHUNG
  4606.       IF fdgdatum%(gebuchtezeile%)<fdgdatum%(gebuchtezeile%-1)
  4607.         es_muss_nach_daten_sortiert_werden%=TRUE ! immer nach daten sortieren wenn editiert wurde
  4608.       ENDIF
  4609.       ' SONDERFALL ZAHLUNG ENTSPR. 4 BUCHUNGSZEILEN
  4610.       IF fdgart%=15 OR fdgart%=16  ! ALSO ZAHLUNG
  4611.         fdgart#(gebuchtezeile%)=20   !  HIER WIRD DIE ZWISCHENSUMME EINGESETZT
  4612.         fdgart#(gebuchtezeile%+1)=fdgart% ! (Zahlungszeile)
  4613.         fdgart#(gebuchtezeile%+2)=21  ! Verrechnungszeile, also auf was verrechnet
  4614.         fdgart#(gebuchtezeile%+3)=22  ! Restsummen nach Verrechnung
  4615.         ' ALLE 4 ZEILEN AUF DAS ZAHLUNGSDATUM SETZEN
  4616.         FOR z%=0 TO 3
  4617.           fdgdatum%(gebuchtezeile%+z%)=forderungsdatum%  ! DAMIT BEIM SORTIE-
  4618.           '  REN NICHTS RAUSFÄLLT
  4619.         NEXT z%
  4620.         INC gebuchtezeile%  ! Zahlung steht in GEBUCHTEZEILE+1 ZAHLUNG WIRD DAHER SPÄTER VERBUCHT/BERECHNET
  4621.       ENDIF
  4622.       ' EINTRAGEN DER DATEN AUS DER MASKE IN DIE FELDER, VERRECHNUNG SPÄTER
  4623.       betrag#(gebuchtezeile%)=fdgbetrag#
  4624.       fdgart#(gebuchtezeile%)=fdgart%
  4625.       IF fdgart#(gebuchtezeile%)<15   !  also nicht bei Zahlungen (fdgart)
  4626.         restbetrag#(gebuchtezeile%)=fdgbetrag#  ! RESTBETRAG
  4627.       ELSE
  4628.         restbetrag#(gebuchtezeile%)=0
  4629.       ENDIF
  4630.       zinssatz#(gebuchtezeile%)=zinsensatz#
  4631.       zinsdatum%(gebuchtezeile%)=zinsdatum%
  4632.       fdgdatum%(gebuchtezeile%)=forderungsdatum%
  4633.       fdgname$(gebuchtezeile%)=fdgname$
  4634.     ELSE  ! 2. ES LIEGT EINE EDITIERTE ZEILE VOR !!!
  4635.       ' FALLUNTERSCHEIDUNGEN: VORHER WIE NACHHER LAG KEINE ZAHLUNGSZEILE VOR
  4636.       ' ODER VORHER ODER NACHHER ODER BEIDESMAL LAG EINE ZAHLUNGSZEILE VOR
  4637.       ' 1. FALL:FDGART VORHER=FDGART NACHHER
  4638.       es_muss_nach_daten_sortiert_werden%=TRUE ! immer nach daten sortieren wenn editiert wurde
  4639.       SELECT fdgart%
  4640.       CASE 1 TO 14  ! ALSO KEINE ZAHLUNG
  4641.         IF fdgart#(gebuchtezeile%)>0 AND fdgart#(gebuchtezeile%)<15  ! WAR VORHER! KEINE ZAHLUNG
  4642.           betrag#(gebuchtezeile%)=fdgbetrag#
  4643.           fdgart#(gebuchtezeile%)=fdgart%
  4644.           restbetrag#(gebuchtezeile%)=fdgbetrag#  ! RESTBETRAG
  4645.           zinssatz#(gebuchtezeile%)=zinsensatz#
  4646.           zinsdatum%(gebuchtezeile%)=zinsdatum%
  4647.           fdgdatum%(gebuchtezeile%)=forderungsdatum%
  4648.           fdgname$(gebuchtezeile%)=fdgname$
  4649.         ELSE
  4650.           ' DREI DER VIER ALTEN ZEILEN LÖSCHEN UND DIE VIERTE MIT DEN WERTEN BELEGEN
  4651.           betrag#(gebuchtezeile%-1)=fdgbetrag#
  4652.           restbetrag#(gebuchtezeile%-1)=fdgbetrag#  ! RESTBETRAG
  4653.           zinssatz#(gebuchtezeile%-1)=zinsensatz#
  4654.           fdgart#(gebuchtezeile%-1)=fdgart%
  4655.           fdgdatum%(gebuchtezeile%-1)=forderungsdatum%
  4656.           zinsdatum%(gebuchtezeile%-1)=zinsdatum%
  4657.           fdgname$(gebuchtezeile%-1)=fdgname$
  4658.           GOSUB zeileloeschen(gebuchtezeile%) ! 1.-3. ZEILE RAUSNEHMEN
  4659.           GOSUB zeileloeschen(gebuchtezeile%)
  4660.           GOSUB zeileloeschen(gebuchtezeile%)
  4661.         ENDIF
  4662.       CASE 15,16  ! ALSO ZAHLUNGEN
  4663.         IF fdgart#(gebuchtezeile%+1)=21  !SUMMENZEILE>>VORHER AUCH ZAHLUNG
  4664.           betrag#(gebuchtezeile%)=fdgbetrag#
  4665.           fdgart#(gebuchtezeile%)=fdgart%
  4666.           restbetrag#(gebuchtezeile%)=0  ! KEIN RESTBETRAG, DA ZAHLUNG
  4667.           zinssatz#(gebuchtezeile%)=zinsensatz#
  4668.           zinsdatum%(gebuchtezeile%)=zinsdatum%
  4669.           fdgdatum%(gebuchtezeile%)=forderungsdatum%
  4670.           fdgdatum%(gebuchtezeile%-1)=forderungsdatum%  ! Damit beim sortieren nichts rausfällt
  4671.           fdgdatum%(gebuchtezeile%+1)=forderungsdatum%
  4672.           fdgdatum%(gebuchtezeile%+2)=forderungsdatum%
  4673.           fdgname$(gebuchtezeile%+2)=fdgname$
  4674.         ELSE
  4675.           ' JETZT ZAHLUNG VORHER ABER NICHT, WIRD HINTEN ANGEHÄNGT
  4676.           GOSUB zeileloeschen(gebuchtezeile%)  ! ALTE ZEILE (EINE) RAUSLÖSCHEN
  4677.           GOSUB freiezeilefinden(1,freiezeile%) ! Aufstellungsende finden
  4678.           ' und die vier neuen Zeilen anhängen
  4679.           fdgart#(freiezeile%)=20   !  HIER WIRD DIE ZWISCHENSUMME EINGEsetzt
  4680.           fdgart#(freiezeile%+1)=fdgart% ! (Zahlungszeile)
  4681.           fdgart#(freiezeile%+2)=21  ! Verrechnungszeile, also auf was verrechnet
  4682.           fdgart#(freiezeile%+3)=22  ! Restsummen nach Verrechnung
  4683.           ' ALLE 4 ZEILEN AUF DAS ZAHLUNGSDATUM SETZEN
  4684.           FOR z%=0 TO 3
  4685.             fdgdatum%(freiezeile%+z%)=forderungsdatum%  ! DAMIT BEIM SORTIEREN NICHTS RAUSFÄLLT
  4686.           NEXT z%
  4687.           INC freiezeile%  ! Zahlung steht in GEBUCHTEZEILE+1 ZAHLUNG WIRD DAHER SPÄTER VERBUCHT/BERECHNET
  4688.           ' EINTRAGEN DER DATEN AUS DER MASKE IN DIE FELDER, VERRECHNUNG SPÄTER
  4689.           betrag#(freiezeile%)=fdgbetrag#
  4690.           fdgart#(freiezeile%)=fdgart%
  4691.           IF fdgart#(freiezeile%)<15   !  also nicht bei Zahlungen (fdgart)
  4692.             restbetrag#(freiezeile%)=fdgbetrag#  ! RESTBETRAG
  4693.           ELSE
  4694.             restbetrag#(freiezeile%)=0
  4695.           ENDIF
  4696.           zinssatz#(freiezeile%)=zinsensatz#
  4697.           zinsdatum%(freiezeile%)=zinsdatum%
  4698.           fdgdatum%(freiezeile%)=forderungsdatum%
  4699.           fdgname$(freiezeile%)=fdgname$
  4700.         ENDIF
  4701.       ENDSELECT
  4702.     ENDIF
  4703.   ENDIF
  4704.   IF exitobjekt%=weiterb&   ! also weiterbuchen
  4705.     GOTO anfang367
  4706.   ENDIF
  4707.   IF es_muss_nach_daten_sortiert_werden%=TRUE
  4708.     GOSUB nachdatensortieren
  4709.   ENDIF
  4710.   GOSUB freiezeilefinden(1,freiezeile%)  ! Bei Zeile 1 starten
  4711.   IF freiezeile%>1  ! Also wenigstens ein Eintrag da, nicht nur Endsummenzeile
  4712.     GOSUB neuberechnung(1)
  4713.     GOSUB forderungstextfeld
  4714.     @redraw_part(0,0)
  4715.   ELSE
  4716.     CLEARW 0
  4717.   ENDIF
  4718. abr367_ende:
  4719. RETURN
  4720. ' ********************************************************************
  4721. > PROCEDURE 367eingaben(VAR ex_obj%,fdgart%,fname$,fbetrag#,zsatz#,zinsdatum%,forderungsdatum%,editorzeile%)
  4722.   ' Heutiges Datum zum Vergleich in der Logikkontrolle heute%
  4723.   GOSUB datumsumwandlung(LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2),heute%,dummy%)
  4724.   buchungsbaum_adr%=rsc_adr%(buchungsbaum&)
  4725.   @dialog_positionieren(buchungsbaum&)
  4726.   GOSUB buchungsbox_initialisieren(0)  ! ohne Redraw
  4727.   ' Vorbereitung des Dialogs
  4728.   @rsc_draw(buchungsbaum&,fensterdial%)
  4729.   DO
  4730.     fehleingabe%=FALSE
  4731.     '
  4732.     ' Duchführen des Dialogs
  4733.     ex_obj%=@rsc_do(buchungsbaum&,fdgdat&,dummy&)  ! dummy, da kein Popupmenu in der Box
  4734.     '
  4735.     ' SCHECKZINSEN SELEKTIERT ?
  4736.     IF @selected(buchungsbaum_adr%,bscheckz&)=TRUE
  4737.       ' selektiert, also diskontabhängige Zinsen gewollt
  4738.       zinsfaktor%=-1
  4739.     ELSE
  4740.       zinsfaktor%=1 ! normale Zinsen
  4741.     ENDIF
  4742.     '
  4743.     ' 1. Selektierung für Zahlungen, da dann keine Zinseingaben zugelassen
  4744.     SELECT ex_obj%
  4745.     CASE zhlgsch&,zhlgdsch&
  4746.       GOSUB del_flag(buchungsbaum_adr%,zinssatz&,8) ! uneditierbar
  4747.       GOSUB del_flag(buchungsbaum_adr%,zinsdat&,8) ! uneditierbar
  4748.       FOR i%=bzinsbox& TO bzinszust&
  4749.         GOSUB do_objc(buchungsbaum_adr%,i%,&H8) ! helle Darstellung
  4750.         GOSUB objc_update(buchungsbaum_adr%,i%)
  4751.       NEXT i%
  4752.     CASE hptfdg& TO nebenfdg&,weiterb&,ok&,abbruch&
  4753.       GOSUB set_flag(buchungsbaum_adr%,zinssatz&,8) ! editierbar
  4754.       GOSUB set_flag(buchungsbaum_adr%,zinsdat&,8) ! editierbar
  4755.       FOR i%=bzinsbox& TO bzinszust&
  4756.         GOSUB undo_objc(buchungsbaum_adr%,i%,&H8) ! normale Darstellung
  4757.         GOSUB objc_update(buchungsbaum_adr%,i%)
  4758.       NEXT i%
  4759.     ENDSELECT
  4760.     '
  4761.     ' 2. Selektierung für normale Abfragen
  4762.     SELECT ex_obj%
  4763.     CASE weiterb&,ok&  ! BUCHUNG ÜBERNEHMEN
  4764.       INC aufstellungsaenderung#  ! Zahl der Änderungen für speichern
  4765.       '
  4766.       ' BETRAG AUSLESEN
  4767.       betrag$=CHAR{{OB_SPEC(buchungsbaum_adr%,betrag&)}}
  4768.       GOSUB zahlenumwandlung(7,betrag$,fbetrag#,eintrag#)
  4769.       IF fbetrag#=0
  4770.         dummy%=@rsc_alert(1,"Keine zulässige|Betragseingabe"," [OK ",1)
  4771.         fehleingabe%=TRUE
  4772.         @select(buchungsbaum_adr%,ex_obj%,FALSE)  ! deselektieren exit-button
  4773.         GOSUB objc_update(buchungsbaum_adr%,ex_obj%)
  4774.         erstes_objekt%=betrag&
  4775.       ENDIF
  4776.       '
  4777.       ' ZINSSATZ UND ZINSDATUM AUSLESEN
  4778.       zsatz$=CHAR{{OB_SPEC(buchungsbaum_adr%,zinssatz&)}}
  4779.       zsatz#=VAL(TRIM$(LEFT$(zsatz$,2))+"."+MID$(zsatz$,3))
  4780.       zinsdat$=CHAR{{OB_SPEC(buchungsbaum_adr%,zinsdat&)}}
  4781.       GOSUB datumsumwandlung(zinsdat$,zinsdatum%,kontrolle%)
  4782.       '
  4783.       ' ZINSEN AB ZUSTELLUNG/VB-ERLASS
  4784.       IF @selected(buchungsbaum_adr%,bzinszust&)=TRUE ! Zinsen ab Zustellg/VBerlaß
  4785.         IF @selected(buchungsbaum_adr%,kostmb&)=TRUE OR @selected(buchungsbaum_adr%,kostvb&)=TRUE
  4786.           zinsdatum%=-2  ! ab VB-Erlaß
  4787.         ELSE
  4788.           zinsdatum%=-1  ! ab Zustellung
  4789.         ENDIF
  4790.       ENDIF
  4791.       ' LOGIKKONTROLLE ZINSEN/ZINSDATUM
  4792.       IF kontrolle%=1 AND zsatz#<>0 AND @selected(buchungsbaum_adr%,bzinszust&)=FALSE
  4793.         ' also falsches Datum eingegeben und Zinssatz, aber keine Zinsen ab Zustellung
  4794.         dummy%=@rsc_alert(1,"Keine zulässige|Zinsdatumseingabe"," [OK ",1)
  4795.         fehleingabe%=TRUE
  4796.         @select(buchungsbaum_adr%,ex_obj%,FALSE)  ! deselektieren exit-button
  4797.         GOSUB objc_update(buchungsbaum_adr%,ex_obj%)
  4798.         erstes_objekt%=zinsdat&
  4799.       ENDIF
  4800.       @datumsumwandlung(CHAR{{OB_SPEC(buchungsbaum_adr%,fdgdat&)}},forderungsdatum%,dummy%)
  4801.       IF forderungsdatum%>zinsdatum% AND zinsdatum%>0
  4802.         dummy%=@rsc_alert(1,"Zinsdatum früher|als Forderungsdatum.|Bitte korrigieren."," [OK ",1)
  4803.         fehleingabe%=TRUE
  4804.         @select(buchungsbaum_adr%,ex_obj%,FALSE)  ! deselektieren exit-button
  4805.         GOSUB objc_update(buchungsbaum_adr%,ex_obj%)
  4806.         erstes_objekt%=zinsdat&
  4807.       ENDIF
  4808.       '
  4809.       ' FORDERUNGSDATUM
  4810.       fdgdat$=CHAR{{OB_SPEC(buchungsbaum_adr%,fdgdat&)}}
  4811.       GOSUB datumsumwandlung(fdgdat$,forderungsdatum%,kontrolle%)
  4812.       IF kontrolle%=1
  4813.         dummy%=@rsc_alert(1,"Kein zulässiges|Forderungsdatum|eingegeben"," [OK ",1)
  4814.         fehleingabe%=TRUE
  4815.         @select(buchungsbaum_adr%,ex_obj%,FALSE)  ! deselektieren exit-button
  4816.         GOSUB objc_update(buchungsbaum_adr%,ex_obj%)
  4817.         erstes_objekt%=fdgdat&
  4818.       ENDIF
  4819.       IF forderungsdatum%>heute%
  4820.         dummy%=@rsc_alert(1,"Forderungsdatum in der|Zukunft eingegeben.|Bitte korrigieren."," [OK ",1)
  4821.         fehleingabe%=TRUE
  4822.         @select(buchungsbaum_adr%,ex_obj%,FALSE)  ! deselektieren exit-button
  4823.         GOSUB objc_update(buchungsbaum_adr%,ex_obj%)
  4824.         erstes_objekt%=fdgdat&
  4825.       ENDIF
  4826.       ' ÜBERPRÜFUNG, OB AUCH DATUMSMÄSSIG DIE LETZTE BUCHUNG VORLIEGT (NUR BEI NEUBUCHUNG)
  4827.       IF datum_der_letzten_buchung%>forderungsdatum% AND freiezeile%<>1 AND editorzeile%=freiezeile%
  4828.         a%=@rsc_alert(1,"Diese Buchung hat|nicht das späteste|Datum. Neueingabe ?"," [Ja |[Nein",1)
  4829.         IF a%=1
  4830.           fehleingabe%=TRUE
  4831.         ELSE
  4832.           es_muss_nach_daten_sortiert_werden%=TRUE
  4833.         ENDIF
  4834.       ELSE
  4835.         datum_der_letzten_buchung%=forderungsdatum%
  4836.       ENDIF
  4837.       @select(buchungsbaum_adr%,ex_obj%,FALSE)  ! deselektieren exit-button
  4838.       GOSUB objc_update(buchungsbaum_adr%,ex_obj%)
  4839.       '
  4840.     CASE zeilback&
  4841.       ' Buchungs- Zeilennummer einsetzen
  4842.       erstes_objekt%=fdgdat&
  4843.       GOSUB erste_buchungszeile_finden(erste_buchungszeile%)
  4844.       DO
  4845.         GOSUB naechste_editorzeile(editorzeile%,erste_buchungszeile%,freiezeile%,-1)
  4846.         '        editorzeile%=MAX(editorzeile%-1,1)
  4847.         editorzeile$=STR$(editorzeile%)
  4848.         CHAR{{OB_SPEC(buchungsbaum_adr%,zeilnr&)}}=editorzeile$
  4849.         IF editorzeile%=freiezeile%
  4850.           @select(buchungsbaum_adr%,zeilnr&,TRUE)  ! Zeilennrbutton als Zeichen für Editmodus
  4851.         ELSE
  4852.           @select(buchungsbaum_adr%,zeilnr&,FALSE)  ! deselektieren wenn neue Buchung
  4853.         ENDIF
  4854.         GOSUB objc_update(buchungsbaum_adr%,zeilnr&)
  4855.         IF editorzeile%=freiezeile%
  4856.           GOSUB buchungsbox_initialisieren(1)
  4857.         ELSE
  4858.           GOSUB editorzeile_einsetzen(editorzeile%)
  4859.         ENDIF
  4860.         EXIT IF MOUSEK=0
  4861.       LOOP
  4862.     CASE zeilforw&
  4863.       ' Buchungs- Zeilennummer einsetzen
  4864.       erstes_objekt%=fdgdat&
  4865.       GOSUB erste_buchungszeile_finden(erste_buchungszeile%)
  4866.       DO
  4867.         GOSUB naechste_editorzeile(editorzeile%,erste_buchungszeile%,freiezeile%,1)
  4868.         '        editorzeile%=MIN(editorzeile%+1,freiezeile%)
  4869.         editorzeile$=STR$(editorzeile%)
  4870.         CHAR{{OB_SPEC(buchungsbaum_adr%,zeilnr&)}}=editorzeile$
  4871.         IF editorzeile%=freiezeile%
  4872.           @select(buchungsbaum_adr%,zeilnr&,TRUE)  ! Zeilennrbutton als Zeichen für Editmodus
  4873.         ELSE
  4874.           @select(buchungsbaum_adr%,zeilnr&,FALSE)  ! deselektieren wenn neue Buchung
  4875.         ENDIF
  4876.         GOSUB objc_update(buchungsbaum_adr%,zeilnr&)
  4877.         IF editorzeile%=freiezeile%
  4878.           GOSUB buchungsbox_initialisieren(1)
  4879.         ELSE
  4880.           GOSUB editorzeile_einsetzen(editorzeile%)
  4881.         ENDIF
  4882.         EXIT IF MOUSEK=0
  4883.       LOOP
  4884.     CASE zeilnr&
  4885.       GOSUB buchungsbox_initialisieren(1)
  4886.     CASE kfb&
  4887.       a$=CHAR{{OB_SPEC(buchungsbaum_adr%,zinssatz&)}}
  4888.       IF a$=""
  4889.         CHAR{{OB_SPEC(buchungsbaum_adr%,zinssatz&)}}=" 400"
  4890.         GOSUB objc_update(buchungsbaum_adr%,zinssatz&)
  4891.       ENDIF
  4892.     CASE kostmb&
  4893.       IF CHAR{{OB_SPEC(buchungsbaum_adr%,betrag&)}}=""  ! Nur wenn leer
  4894.         ' Summe der HFs errechnen
  4895.         GOSUB freiezeilefinden(1,freiezeile%)
  4896.         a#=0
  4897.         FOR i%=1 TO freiezeile%
  4898.           IF fdgart#(i%)=1 ! also Hauptforderung
  4899.             ADD a#,betrag#(i%)
  4900.           ENDIF
  4901.         NEXT i%
  4902.         GOSUB tag_absolut(VAL(LEFT$(DATE$,2)),VAL(MID$(DATE$,4,2)),VAL(RIGHT$(DATE$,2)),vor1995%)
  4903.         IF vor1995%>728599  ! aktuelles Tagesdatum nach 31.12.94
  4904.           GOSUB gebuehrenermittlung(a#,ostwestfaktor#,g3#,dummy#,dummy#,g10#,dummy#)
  4905.           GOSUB gerichtskostenermittlung(a#,gk5#,dummy#)
  4906.           b#=gk5#  ! Gerichtskosten ohne Zustellung ab 1.7.94
  4907.         ELSE  ! bis 31.12.94
  4908.           GOSUB gebuehrenermittlung(a#,ostwestfaktor#,g3#,dummy#,dummy#,g10#,dummy#)
  4909.           GOSUB gerichtskostenermittlung_alt(a#,gk5#,dummy#)
  4910.           b#=mb_agzahl%*gkzust#+gk5#  ! Gerichtskosten bis 31.12.94
  4911.         ENDIF
  4912.         c#=((mb_aszahl%-1)*g3#+g10#) ! RA-Kosten
  4913.         d#=MIN(ROUND(0.15*c#+0.049,1),40)  ! Auslagen
  4914.         e#=ROUND(mb_mitmwst%*mwstsatz#/100*(c#+d#),2)  ! MwSt
  4915.         @dm_zahlen_einsetzen(buchungsbaum_adr%,betrag&,b#+c#+d#+e#,9)
  4916.         CHAR{{OB_SPEC(buchungsbaum_adr%,zinssatz&)}}=" 400"
  4917.         CHAR{{OB_SPEC(buchungsbaum_adr%,zinsdat&)}}=titeldatum$
  4918.         GOSUB objc_update(buchungsbaum_adr%,betrag&)
  4919.         GOSUB objc_update(buchungsbaum_adr%,zinssatz&)
  4920.         GOSUB objc_update(buchungsbaum_adr%,zinsdat&)
  4921.       ENDIF
  4922.     CASE kostvb&
  4923.       IF CHAR{{OB_SPEC(buchungsbaum_adr%,betrag&)}}=""  ! Nur wenn leer
  4924.         ' Summe der HFs errechnen
  4925.         GOSUB freiezeilefinden(1,freiezeile%)
  4926.         a#=0
  4927.         FOR i%=1 TO freiezeile%
  4928.           IF fdgart#(i%)=1 ! also Hauptforderung
  4929.             ADD a#,betrag#(i%)
  4930.           ENDIF
  4931.         NEXT i%
  4932.         GOSUB tag_absolut(VAL(LEFT$(DATE$,2)),VAL(MID$(DATE$,4,2)),VAL(RIGHT$(DATE$,2)),vor1995%)
  4933.         IF vor1995%>728599  ! aktuelles Tagesdatum nach 31.12.94
  4934.           GOSUB gebuehrenermittlung(a#,ostwestfaktor#,dummy#,g5#,dummy#,g10#,dummy#)
  4935.           b#=0  ! Zustellkosten ab 1.7.94 weggefallen
  4936.         ELSE  ! bis 31.12.94
  4937.           GOSUB gebuehrenermittlung(a#,ostwestfaktor#,dummy#,g5#,dummy#,g10#,dummy#)
  4938.           b#=mb_agzahl%*gkzust#*(-1)*vb_parteizustellung%  ! Gerichtskosten bis 31.12.94
  4939.         ENDIF
  4940.         c#=g5#  ! RA-Kosten
  4941.         f#=MIN(ROUND(0.15*g10#+0.049,1),40)  ! Auslagen Des MB
  4942.         d#=MIN(ROUND(0.15*c#+0.049,1),40-f#)  ! Auslagen insg max DM 40
  4943.         e#=ROUND(mb_mitmwst%*mwstsatz#/100*(c#+d#),2)  ! MwSt
  4944.         @dm_zahlen_einsetzen(buchungsbaum_adr%,betrag&,b#+c#+d#+e#,9)
  4945.         CHAR{{OB_SPEC(buchungsbaum_adr%,zinssatz&)}}=" 400"
  4946.         CHAR{{OB_SPEC(buchungsbaum_adr%,zinsdat&)}}=titeldatum$
  4947.         GOSUB objc_update(buchungsbaum_adr%,betrag&)
  4948.         GOSUB objc_update(buchungsbaum_adr%,zinssatz&)
  4949.         GOSUB objc_update(buchungsbaum_adr%,zinsdat&)
  4950.       ENDIF
  4951.     CASE ema&
  4952.       IF CHAR{{OB_SPEC(buchungsbaum_adr%,betrag&)}}=""
  4953.         @dm_zahlen_einsetzen(buchungsbaum_adr%,betrag&,gebema#,9)
  4954.         GOSUB objc_update(buchungsbaum_adr%,betrag&)
  4955.       ENDIF
  4956.     CASE panfr&
  4957.       IF CHAR{{OB_SPEC(buchungsbaum_adr%,betrag&)}}=""
  4958.         @dm_zahlen_einsetzen(buchungsbaum_adr%,betrag&,gebpanfr#,9)
  4959.         GOSUB objc_update(buchungsbaum_adr%,betrag&)
  4960.       ENDIF
  4961.     CASE bzinszust&
  4962.       IF @selected(buchungsbaum_adr%,bzinszust&)=TRUE
  4963.         CHAR{{OB_SPEC(buchungsbaum_adr%,zinsdat&)}}="" ! Da Zinsen ab Zustellg
  4964.         GOSUB do_objc(buchungsbaum_adr%,zinsdat&,&H8) ! helle Darstellung
  4965.         GOSUB del_flag(buchungsbaum_adr%,zinsdat&,8) ! uneditierbar
  4966.       ELSE
  4967.         GOSUB undo_objc(buchungsbaum_adr%,zinsdat&,&H8) ! normale Darstellung
  4968.         GOSUB set_flag(buchungsbaum_adr%,zinsdat&,8) ! editierbar
  4969.       ENDIF
  4970.       GOSUB objc_update(buchungsbaum_adr%,zinsdat&)
  4971.     ENDSELECT
  4972.     EXIT IF ex_obj%=abbruch&
  4973.     EXIT IF ex_obj%=weiterb& AND fehleingabe%=FALSE
  4974.     EXIT IF ex_obj%=ok& AND fehleingabe%=FALSE
  4975.   LOOP
  4976.   @select(buchungsbaum_adr%,ex_obj%,FALSE)  ! deselektieren exit-button
  4977.   ' aussuchen der gewählten forderungsart
  4978.   FOR i%=hptfdg& TO zhlgdsch&
  4979.     IF @selected(buchungsbaum_adr%,i%)
  4980.       fdgart%=i%-hptfdg&+1
  4981.     ENDIF
  4982.   NEXT i%
  4983.   IF fdgart%=14  ! Forderungsart aus popupmenu
  4984.     fname$=TRIM$(CHAR{{OB_SPEC(buchungsbaum_adr%,fdgartpop&)}})+" "
  4985.   ELSE
  4986.     fname$=""
  4987.   ENDIF
  4988.   zsatz#=zsatz#*zinsfaktor%  ! also negativ bei Scheckzinsen
  4989.   @select(buchungsbaum_adr%,hptfdg&+fdgart%-1,FALSE)  ! DESELEKTIEREN FDG-ART-BUTTON
  4990.   ' Beenden des Dialogs
  4991.   rsc_back(buchungsbaum&)
  4992. RETURN
  4993. ' ********************************************************************
  4994. > PROCEDURE feldleeren
  4995.   LOCAL i%
  4996.   aufstellungsaenderung#=0  ! zu SPEICHERN?-Abfrage benötigt
  4997.   dateiname$=""  ! Für Voreinstellungen bei diskladen bzw speichern
  4998.   ' Felder löschen
  4999.   ARRAYFILL fdgdatum%(),0
  5000.   ARRAYFILL zinsdatum%(),0
  5001.   ARRAYFILL betrag#(),0
  5002.   ARRAYFILL restbetrag#(),0
  5003.   ARRAYFILL zinssatz#(),0
  5004.   ARRAYFILL fdgart#(),0
  5005.   FOR i%=0 TO maximalbuchungen%
  5006.     fdgtxt$(i%)=""
  5007.     fdgname$(i%)=""
  5008.   NEXT i%
  5009.   ' FELDER SIND LEER
  5010.   mitmwst%=1 ! Vorwahl MwSt ja für Gebührendazusetzen
  5011.   mb_mitmwst%=1
  5012.   CLR adressatanrede1$,adressatanrede2$,adressatstrasse$,adressatort$
  5013.   ' gf1&+gf2& beim Adressaten ignoriert
  5014.   CLR vollstreckungsgerichtanrede1$,vollstreckungsgerichtanrede2$,vollstreckungsgerichtstrasse$,vollstreckungsgerichtort$
  5015.   CLR glaeubigeranrede1$,glaeubigeranrede2$,glaeubigerstrasse$,glaeubigerort$,glaeubigergf1$,glaeubigergf2#
  5016.   CLR schuldneranrede1$,schuldneranrede2$,schuldnerstrasse$,schuldnerort$,schuldnergf1$,schuldnergf2$
  5017.   CLR drittschuldneranrede1$,drittschuldneranrede2$,drittschuldnerstrasse$,drittschuldnerort$,drittschuldnergf1$,drittschuldnergf2$
  5018.   titelart%=3 ! voreinstellung VB
  5019.   CLR titelgericht$,titelort$,titeldatum$,titelaz$
  5020.   mb_agzahl%=1
  5021.   mb_aszahl%=1
  5022. RETURN
  5023. ' ********************************************************************
  5024. > PROCEDURE freiezeilefinden(startzeile%,VAR endzeile%)
  5025.   ' startzeile% ist die Zeile, ab der gesucht wird
  5026.   endzeile%=startzeile%
  5027.   DO
  5028.     EXIT IF fdgart#(endzeile%)=0   ! FORDERUNGSART=0
  5029.     INC endzeile%
  5030.   LOOP
  5031.   ' endzeile% ist nun die freie Zeile
  5032.   IF endzeile%>11 AND demoversion%=TRUE
  5033.     dummy%=@rsc_alert(1,"Geld_her! 2.1 Demoversion|Nur 10 Buchungszeilen möglich."," [Ende ",1)
  5034.     @global_exit
  5035.   ENDIF
  5036. RETURN
  5037. ' ********************************************************************
  5038. > PROCEDURE zustelldatum_pruefen
  5039.   zustdatumbaum_adr%=rsc_adr%(zustdatumbaum&)
  5040.   ' verstecken mit hide-flag
  5041.   GOSUB set_flag(zustdatumbaum_adr%,zustelldatum&,128)
  5042.   GOSUB set_flag(zustdatumbaum_adr%,erlassvbdatum&,128)
  5043.   @freiezeilefinden(1,freiezeile%)
  5044.   erstes_objekt%=0
  5045.   FOR i%=1 TO freiezeile%
  5046.     IF zinsdatum%(i%)<0  ! kommt also mindestens 1* vor; -1=Zustell-,-2 VB-Erlaßdatum
  5047.       @dialog_positionieren(zustdatumbaum&)
  5048.       SELECT zinsdatum%(i%)
  5049.       CASE -2
  5050.         GOSUB del_flag(zustdatumbaum_adr%,erlassvbdatum&,128)
  5051.         CHAR{{OB_SPEC(zustdatumbaum_adr%,erlassvbdatum&)}}="" ! Rücksetzen
  5052.         erstes_objekt%=erlassvbdatum&
  5053.       CASE -1
  5054.         GOSUB del_flag(zustdatumbaum_adr%,zustelldatum&,128)
  5055.         CHAR{{OB_SPEC(zustdatumbaum_adr%,zustelldatum&)}}=""  ! Rücksetzen
  5056.         erstes_objekt%=zustelldatum&
  5057.       ENDSELECT
  5058.     ENDIF
  5059.   NEXT i%  ! Felder sind ggf sichtbar
  5060.   IF erstes_objekt%>0  ! dann ein Feld eingabebereit ==> Dialog durchführen
  5061.     rsc_draw(zustdatumbaum&,fensterdial%)
  5062.     ex_obj%=@rsc_do(zustdatumbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  5063.     rsc_back(zustdatumbaum&)
  5064.     @select(zustdatumbaum_adr%,ex_obj%,FALSE)
  5065.     zustelldatum$=CHAR{{OB_SPEC(zustdatumbaum_adr%,zustelldatum&)}}
  5066.     vberlassdatum$=CHAR{{OB_SPEC(zustdatumbaum_adr%,erlassvbdatum&)}}
  5067.     IF ex_obj%=zustok&
  5068.       IF zustelldatum$<>""
  5069.         @datumsumwandlung(zustelldatum$,z%,dummy%)
  5070.         FOR j%=1 TO freiezeile%
  5071.           IF zinsdatum%(j%)=-1
  5072.             zinsdatum%(j%)=z%
  5073.           ENDIF
  5074.         NEXT j%
  5075.       ENDIF
  5076.       IF vberlassdatum$<>""
  5077.         @datumsumwandlung(vberlassdatum$,z%,dummy%)
  5078.         FOR j%=1 TO freiezeile%
  5079.           IF zinsdatum%(j%)=-2
  5080.             zinsdatum%(j%)=z%
  5081.           ENDIF
  5082.         NEXT j%
  5083.       ENDIF
  5084.     ENDIF
  5085.   ENDIF
  5086. RETURN
  5087. ' ********************************************************************
  5088. > PROCEDURE diskontsaetze_eingeben
  5089.   @resource_einrichten(2)
  5090.   '
  5091.   ' AKTUELLEN ZINSSATZ SUCHEN
  5092.   FOR heutezeile%=1 TO 199
  5093.     EXIT IF diskont#(heutezeile%+1,1)=0  ! d.h. eine Zeile zu weit
  5094.   NEXT heutezeile%
  5095.   zeile%=heutezeile%+1
  5096.   '
  5097.   diskontbaum_adr%=rsc_adr%(diskontbaum&)
  5098.   @dialog_positionieren(diskontbaum&)
  5099.   CHAR{{OB_SPEC(diskontbaum_adr%,diskdat&)}}=""
  5100.   CHAR{{OB_SPEC(diskontbaum_adr%,disksatz&)}}=""
  5101.   CHAR{{OB_SPEC(diskontbaum_adr%,diskzeil&)}}=""
  5102.   @select(diskontbaum_adr%,diskzeil&,TRUE)  ! SELEKTIEREN (SCHWARZ)
  5103.   CHAR{{OB_SPEC(diskontbaum_adr%,diskzeil&)}}=STR$(heutezeile%+1)
  5104.   ' Vorbereitung des Dialogs
  5105.   rsc_draw(diskontbaum&,fensterdial%)
  5106.   '
  5107. nochmal_diskont:
  5108.   ' Duchführen des Dialogs
  5109.   ex_obj%=@rsc_do(diskontbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  5110.   SELECT ex_obj%
  5111.   CASE diskok&
  5112.     diskdat$=CHAR{{OB_SPEC(diskontbaum_adr%,diskdat&)}}
  5113.     GOSUB datumsumwandlung(diskdat$,diskdat%,kontrolle%)
  5114.     IF kontrolle%=1
  5115.       @select(diskontbaum_adr%,ex_obj%,FALSE)
  5116.       GOSUB objc_update(diskontbaum_adr%,ex_obj%)
  5117.       dummy%=@rsc_alert(1,"Unzulässiges Datum"," [OK ",1)
  5118.       GOTO nochmal_diskont
  5119.     ENDIF
  5120.     t%=VAL(LEFT$(diskdat$,2))
  5121.     m%=VAL(MID$(diskdat$,3,2))
  5122.     j%=VAL(RIGHT$(diskdat$,2))
  5123.     GOSUB tag_absolut(t%,m%,j%,diskdat%)
  5124.     diskont#(zeile%,1)=diskdat%
  5125.     disksatz$=CHAR{{OB_SPEC(diskontbaum_adr%,disksatz&)}}
  5126.     GOSUB zahlenumwandlung(2,disksatz$,disksatz#,kontrolle#)
  5127.     diskont#(zeile%,2)=disksatz#
  5128.     GOSUB diskontsaetze_sortieren
  5129.     GOSUB diskontsaetze_speichern
  5130.   CASE diskloes&
  5131.     IF zeile%>=heutezeile%
  5132.       diskont#(zeile%,1)=0 ! Aktuellen Diskontsatz löschen
  5133.       diskont#(zeile%,2)=0
  5134.     ELSE
  5135.       diskont#(zeile%,1)=diskont#(heutezeile%,1) ! Einfach aktuellen Diskontsatz
  5136.       diskont#(zeile%,2)=diskont#(heutezeile%,2) ! verschieben und dann sortieren
  5137.       diskont#(heutezeile%,1)=0 ! Aktuellen Diskontsatz löschen
  5138.       diskont#(heutezeile%,2)=0
  5139.       GOSUB diskontsaetze_sortieren
  5140.     ENDIF
  5141.     GOSUB diskontsaetze_speichern
  5142.   CASE diskup&
  5143.     ' ZEILE berechnen und einsetzen
  5144.     zeile%=MIN(zeile%+1,heutezeile%+1)
  5145.     CHAR{{OB_SPEC(diskontbaum_adr%,diskzeil&)}}=STR$(zeile%)
  5146.     GOSUB objc_update(diskontbaum_adr%,diskzeil&)
  5147.     IF zeile%=heutezeile%+1  ! Dann NEUEINGABE
  5148.       @select(diskontbaum_adr%,diskzeil&,TRUE)  ! SELEKTIEREN (SCHWARZ)
  5149.       GOSUB objc_update(diskontbaum_adr%,diskzeil&)
  5150.       ' Eingebefelder löschen
  5151.       CHAR{{OB_SPEC(diskontbaum_adr%,diskdat&)}}=""
  5152.       GOSUB objc_update(diskontbaum_adr%,diskdat&)
  5153.       CHAR{{OB_SPEC(diskontbaum_adr%,disksatz&)}}=""
  5154.       GOSUB objc_update(diskontbaum_adr%,disksatz&)
  5155.     ELSE  ! Dann nur Bearbeitung/ Anzeige
  5156.       @select(diskontbaum_adr%,diskzeil&,FALSE)  ! DESELEKTIEREN (WEISS)
  5157.       GOSUB objc_update(diskontbaum_adr%,diskzeil&)
  5158.       ' zugehöriges DATUM der Diskonts ermitteln und einsetzen
  5159.       GOSUB datums_rueckumwandlung(diskont#(zeile%,1),t%,m%,j%)
  5160.       GOSUB datumsstring_erstellen(t%,m%,j%,1,diskontdatum$)
  5161.       CHAR{{OB_SPEC(diskontbaum_adr%,diskdat&)}}=diskontdatum$
  5162.       GOSUB objc_update(diskontbaum_adr%,diskdat&)
  5163.       ' zugehörigen DISKONTSATZ ermitteln und einstellen
  5164.       diskontsatz$=STR$(diskont#(zeile%,2)*100,4) ! wegen der Pfennige bzw Kommata
  5165.       CHAR{{OB_SPEC(diskontbaum_adr%,disksatz&)}}=diskontsatz$
  5166.       GOSUB objc_update(diskontbaum_adr%,disksatz&)
  5167.     ENDIF
  5168.     ' Rücksprung zur Bearbeitung
  5169.     GOTO nochmal_diskont
  5170.   CASE diskdown&
  5171.     ' ZEILE berechnen und einsetzen
  5172.     zeile%=MAX(zeile%-1,1)
  5173.     CHAR{{OB_SPEC(diskontbaum_adr%,diskzeil&)}}=STR$(zeile%)
  5174.     GOSUB objc_update(diskontbaum_adr%,diskzeil&)
  5175.     ' zugehöriges DATUM der Diskonts ermitteln und einsetzen
  5176.     GOSUB datums_rueckumwandlung(diskont#(zeile%,1),t%,m%,j%)
  5177.     GOSUB datumsstring_erstellen(t%,m%,j%,1,diskontdatum$)
  5178.     CHAR{{OB_SPEC(diskontbaum_adr%,diskdat&)}}=diskontdatum$
  5179.     GOSUB objc_update(diskontbaum_adr%,diskdat&)
  5180.     ' zugehörigen DISKONTSATZ ermitteln und einstellen
  5181.     diskontsatz$=STR$(diskont#(zeile%,2)*100,4) ! wegen der Pfennige bzw Kommata
  5182.     CHAR{{OB_SPEC(diskontbaum_adr%,disksatz&)}}=diskontsatz$
  5183.     GOSUB objc_update(diskontbaum_adr%,disksatz&)
  5184.     @select(diskontbaum_adr%,diskzeil&,FALSE)  ! SELEKTIEREN (SCHWARZ)
  5185.     GOSUB objc_update(diskontbaum_adr%,diskzeil&)
  5186.     ' Rücksprung zur Bearbeitung
  5187.     GOTO nochmal_diskont
  5188.   CASE diskzeil&
  5189.     zeile%=heutezeile%+1  ! Dann NEUEINGABE
  5190.     @select(diskontbaum_adr%,diskzeil&,TRUE)  ! SELEKTIEREN (SCHWARZ)
  5191.     CHAR{{OB_SPEC(diskontbaum_adr%,diskzeil&)}}=STR$(zeile%)
  5192.     GOSUB objc_update(diskontbaum_adr%,diskzeil&)
  5193.     ' Eingebefelder löschen
  5194.     CHAR{{OB_SPEC(diskontbaum_adr%,diskdat&)}}=""
  5195.     GOSUB objc_update(diskontbaum_adr%,diskdat&)
  5196.     CHAR{{OB_SPEC(diskontbaum_adr%,disksatz&)}}=""
  5197.     GOSUB objc_update(diskontbaum_adr%,disksatz&)
  5198.     ' Rücksprung zur Bearbeitung
  5199.     GOTO nochmal_diskont
  5200.   ENDSELECT
  5201.   '
  5202.   ' Beenden des Dialogs
  5203.   rsc_back(diskontbaum&)
  5204.   @select(diskontbaum_adr%,ex_obj%,FALSE)
  5205.   @resource_einrichten(1)
  5206. RETURN
  5207. ' ********************************************************************
  5208. '
  5209. ' EINFÜGEN UND LÖSCHEN SOWIE NEUES SORTIEREN
  5210. '
  5211. ' *******************************************************************
  5212. > PROCEDURE zeileneinfuegen(wo%,wieviele%)
  5213.   LOCAL i%
  5214.   FOR i%=wo% TO wo%+wieviele%-1
  5215.     INSERT betrag#(i%)=0
  5216.     INSERT restbetrag#(i%)=0
  5217.     INSERT zinssatz#(i%)=0
  5218.     INSERT kzins#(i%)=0
  5219.     INSERT fdgart#(i%)=0
  5220.     INSERT fdgdatum%(i%)=0
  5221.     INSERT zinsdatum%(i%)=0
  5222.     INSERT fdgname$(i%)=""
  5223.   NEXT i%
  5224. RETURN
  5225. ' *******************************************************************+
  5226. > PROCEDURE loeschzeile
  5227.   @resource_einrichten(2) ! Zweitresource einrichten
  5228.   GOSUB freiezeilefinden(1,freiezeile%)
  5229.   loeschbaum_adr%=rsc_adr%(loeschbaum&)
  5230.   @dialog_positionieren(loeschbaum&)
  5231.   CHAR{{OB_SPEC(loeschbaum_adr%,zeilenr&)}}=""
  5232.   ' Vorbereitung des Dialogs
  5233.   rsc_draw(loeschbaum&,fensterdial%)
  5234.   ' Duchführen des Dialogs
  5235.   ex_obj%=@rsc_do(loeschbaum&,zeilenr&,dummy&)  ! dummy, da kein Popupmenu in der Box
  5236.   zeilenr$=CHAR{{OB_SPEC(loeschbaum_adr%,zeilenr&)}}
  5237.   GOSUB zahlenumwandlung(4,zeilenr$,znr#,kontrolle#)
  5238.   IF ex_obj%=zabbruch& OR kontrolle#=0 OR znr#=0 OR znr#>freiezeile%-2 ! Abbruch oder kein Eintrag bzw 0
  5239.     GOTO loeschende
  5240.   ENDIF
  5241.   zeilennr%=znr#
  5242.   ' ++++++++++++++
  5243.   IF fdgart#(zeilennr%)>14  ! ALSO ZAHLUNG ODER ZWISCHENSUMME
  5244.     IF fdgart#(zeilennr%)=15 OR fdgart#(zeilennr%)=16
  5245.       GOSUB zeileloeschen(zeilennr%+1) ! VERRECHNUNGSZEILE
  5246.       GOSUB zeileloeschen(zeilennr%+1) ! neusummenzeile
  5247.       GOSUB zeileloeschen(zeilennr%)  ! ZAHLUNGSZEILE
  5248.       GOSUB zeileloeschen(zeilennr%-1) ! ZWISCHENSUMMENZEILE
  5249.     ELSE
  5250.       dummy%=@rsc_alert(1,"Zwischensummen können nur mit|der Zahlung gelöscht werden.","[Abbruch",1)
  5251.       GOTO loeschende
  5252.     ENDIF
  5253.   ELSE
  5254.     GOSUB zeileloeschen(zeilennr%)
  5255.   ENDIF
  5256.   aufstellungsaenderung#=TRUE
  5257. loeschende:
  5258.   '
  5259.   ' Beenden des Dialogs
  5260.   rsc_back(loeschbaum&)
  5261.   @select(loeschbaum_adr%,ex_obj%,FALSE)
  5262.   ' Dialog beendet
  5263.   GOSUB neuberechnung(1)
  5264.   GOSUB forderungstextfeld
  5265.   @resource_einrichten(1) ! Erstresource einrichten
  5266. RETURN
  5267. ' **************************************************************************
  5268. > PROCEDURE zeileloeschen(zeilennr%)
  5269.   aufstellungaenderung#=TRUE  ! für SPEICHERN ? -Abfrage benötigt
  5270.   DELETE betrag#(zeilennr%)
  5271.   DELETE restbetrag#(zeilennr%)
  5272.   DELETE zinssatz#(zeilennr%)
  5273.   DELETE kzins#(zeilennr%)
  5274.   DELETE fdgart#(zeilennr%)
  5275.   DELETE fdgdatum%(zeilennr%)
  5276.   DELETE zinsdatum%(zeilennr%)
  5277.   DELETE fdgname$(zeilennr%)
  5278. RETURN
  5279. ' ************************************************************************
  5280. > PROCEDURE nachdatensortieren
  5281.   LOCAL i%,j%
  5282.   GOSUB freiezeilefinden(1,freiezeile%)
  5283.   FOR i%=1 TO freiezeile%-2
  5284.     IF fdgdatum%(i%)>fdgdatum%(i%+1)  !  ALSO DATEN FALSCHRUM SORTIERT
  5285.       ' letzte Zeile mit Datum suchen, das <= fdgdatum%(i%+1) ist
  5286.       FOR j%=1 TO i%
  5287.         EXIT IF fdgdatum%(j%)>fdgdatum%(i%+1)  ! Dann eine Zeile zuweit
  5288.       NEXT j%
  5289.       '
  5290.       ' Einfügen an der richtigen Stelle
  5291.       ' Index ist i%+1 und/oder i%+2, da offenbar im Editor zuerst die Zeile
  5292.       ' eingefügt wird, im Compiler aber umgekehrt. Ausnahme: String-Felder
  5293.       IF @compiled
  5294.         INSERT betrag#(j%)=betrag#(i%+1)
  5295.         INSERT restbetrag#(j%)=restbetrag#(i%+1)
  5296.         INSERT zinssatz#(j%)=zinssatz#(i%+1)
  5297.         INSERT fdgart#(j%)=fdgart#(i%+1)
  5298.         INSERT fdgdatum%(j%)=fdgdatum%(i%+1)
  5299.         INSERT zinsdatum%(j%)=zinsdatum%(i%+1)
  5300.         INSERT fdgname$(j%)=fdgname$(i%+2) !!! Ausnahme i%+2)
  5301.       ELSE
  5302.         INSERT betrag#(j%)=betrag#(i%+2)
  5303.         INSERT restbetrag#(j%)=restbetrag#(i%+2)
  5304.         INSERT zinssatz#(j%)=zinssatz#(i%+2)
  5305.         INSERT fdgart#(j%)=fdgart#(i%+2)
  5306.         INSERT fdgdatum%(j%)=fdgdatum%(i%+2)
  5307.         INSERT zinsdatum%(j%)=zinsdatum%(i%+2)
  5308.         INSERT fdgname$(j%)=fdgname$(i%+2)
  5309.       ENDIF
  5310.       ' Zeile ist nun doppelt vorhanden ==> einmal rauslöschen
  5311.       @zeileloeschen(i%+2)
  5312.     ENDIF
  5313.   NEXT i%
  5314. RETURN
  5315. ' ***********************************************************************
  5316. > PROCEDURE diskontsaetze_sortieren
  5317.   i%=1
  5318.   DO
  5319.     EXIT IF diskont#(i%,1)=0  ! Also nichts eingetragen
  5320.     INC i%
  5321.   LOOP
  5322.   heutezeile%=i%-1
  5323.   FOR j%=1 TO heutezeile%-2
  5324.     FOR i%=1 TO heutezeile%-1
  5325.       IF diskont#(i%,1)>diskont#(i%+1,1) !  ALSO DATEN FALSCHRUM SORTIERT
  5326.         SWAP diskont#(i%,1),diskont#(i%+1,1)
  5327.         SWAP diskont#(i%,2),diskont#(i%+1,2)
  5328.       ENDIF
  5329.     NEXT i%
  5330.   NEXT j%
  5331. RETURN
  5332. ' *********************************************************************
  5333. '
  5334. ' DISKETTENPROZEDUREN
  5335. '
  5336. ' *****************************************************************
  5337. > FUNCTION fileselect$(a$,pfad$,file$)  ! Unterscheidet ab GEM 1.04
  5338.   LOCAL f&,b&
  5339.   '
  5340.   ~WIND_UPDATE(1)                           ! BEG_UPDATE
  5341.   '
  5342.   IF INT{ADD({ADD(GB,4)},0)}<&H140          ! Altes GEM/TOS...
  5343.     f&=FSEL_INPUT(pfad$,file$,b&)
  5344.     '
  5345.   ELSE                                      ! Sonst mit Titelzeile...
  5346.     f&=@fsel_exinput(a$,pfad$,file$,b&)
  5347.   ENDIF
  5348.   '
  5349.   ~WIND_UPDATE(0)                           ! END_UPDATE
  5350.   '
  5351.   IF f&=0 OR b&=0                           ! Abbruch oder Error...
  5352.     RETURN ""
  5353.   ENDIF
  5354.   '
  5355.   RETURN LEFT$(pfad$,RINSTR(pfad$,"\"))+file$
  5356. ENDFUNC
  5357. ' *******************************************************************++
  5358. > FUNCTION fsel_exinput(a$,VAR pfad$,file$,b&)
  5359.   $F%
  5360.   '
  5361.   a$=a$+CHR$(0)         ! Titel
  5362.   pfad$=pfad$+CHR$(0)+SPACE$(400)
  5363.   file$=file$+CHR$(0)+SPACE$(150)
  5364.   '
  5365.   GCONTRL(0)=91
  5366.   GCONTRL(1)=0
  5367.   GCONTRL(2)=2
  5368.   GCONTRL(3)=3
  5369.   GCONTRL(4)=0
  5370.   '
  5371.   ADDRIN(0)=V:pfad$     ! Pfad
  5372.   ADDRIN(1)=V:file$     ! Datei
  5373.   ADDRIN(2)=V:a$        ! Titel
  5374.   '
  5375.   GEMSYS
  5376.   '
  5377.   pfad$=CHAR{V:pfad$}   ! Pfad
  5378.   file$=CHAR{V:file$}   ! Dateiname
  5379.   '
  5380.   b&=GINTOUT(1)         ! Abbruch=0, OK=1
  5381.   '
  5382.   RETURN GINTOUT(0)     ! Fehlercode
  5383. ENDFUNC
  5384. ' ****************************************************************+
  5385. > PROCEDURE diskladen(filename$)
  5386.   ' übergebener Dateiname muß "" sein für Fileselectboxaufruf, sonst wird direkt geladen
  5387.   ON ERROR GOSUB diskladenerror
  5388.   diskladenabbruch%=FALSE
  5389.   IF filename$=""  ! Dann mit Fileselectbox
  5390.     pfad$=boot_pfad$+"\*.DAT"
  5391.     dateiname$=@fileselect$("Forderungsberechnung laden",pfad$,"GELD_HER.DAT")
  5392.     IF dateiname$="" OR RIGHT$(dateiname$)="\"
  5393.       diskladenabbruch%=TRUE
  5394.       GOTO diskladenende
  5395.     ENDIF
  5396.   ELSE
  5397.     dateiname$=filename$
  5398.   ENDIF
  5399.   IF EXIST(dateiname$)
  5400.     GOSUB freiezeilefinden(1,freiezeile%)  ! Damit bei dazuladen nichts überschrieben wird
  5401.     aufstellungsaenderung#=FALSE
  5402.     GOSUB mausform(8)  ! DISKETTE
  5403.     '
  5404.     ' FESTSTELLEN, WELCHE VERSION DER ABSPEICHERUNG VORLAG
  5405.     OPEN "I",#1,dateiname$
  5406.     INPUT #1,dummy# ! mitmwst% zum vorselektieren des MwStbuttons (KANN NUR 0 ODER 1 SEIN)
  5407.     IF dummy#<1.99  ! ALSO KLEINER ALS VERSION 2.0
  5408.       mitmwst%=dummy#  ! dann ist der Wert die Variable mitmwst%
  5409.       ' LADEN VON AUFSTELLUNGEN VERSION 1.XX
  5410.       verrechnungsart#=standardverrechnungsart#  ! indiv. Verrechnungsart gibts erst ab 2.0
  5411.       INPUT #1,az$,vollstreckungsgerichtanrede1$,vollstreckungsgerichtanrede2$,vollstreckungsgerichtstrasse$,vollstreckungsgerichtort$
  5412.       INPUT #1,glaeubigeranrede1$,glaeubigeranrede2$,glaeubigerstrasse$,glaeubigerort$,glaeubigergf1$,glaeubigergf2$
  5413.       INPUT #1,schuldneranrede1$,schuldneranrede2$,schuldnerstrasse$,schuldnerort$,schuldnergf1$,schuldnergf2$
  5414.       INPUT #1,titelart%,titelgericht$,titelort$,titeldatum$,titelaz$
  5415.       IF INSTR(titeldatum$,".")>0  ! dann aufspalten für Dialogbox
  5416.         @datum_aufspalten(titeldatum$,t%,m%,j%)
  5417.         @datumsstring_erstellen(t%,m%,j%,1,titeldatum$)
  5418.       ENDIF
  5419.       SELECT titelart%
  5420.       CASE 1
  5421.         titelart$="Urteil"
  5422.       CASE 2
  5423.         titelart$="Vergleich"
  5424.       CASE 3
  5425.         titelart$="Vollstreckungsbescheid"
  5426.       CASE 4
  5427.         titelart$="Kostenfestsetzungsbeschluß"
  5428.       CASE 5
  5429.         titelart$="notar. Schuldanerkenntnis"
  5430.       ENDSELECT
  5431.       i%=freiezeile%
  5432.       DO
  5433.         INPUT #1,betrag#(i%)
  5434.         INPUT #1,dummy$  ! Forderungsdatum tt.mm.jj
  5435.         @datum_aufspalten(dummy$,t%,m%,y%)
  5436.         @tag_absolut(t%,m%,y%,dummy%)
  5437.         fdgdatum%(i%)=dummy%
  5438.         EXIT IF fdgdatum%(i%)=0 ! WEIL J% SCHON ERHÖHT WURDE
  5439.         INPUT #1,restbetrag#(i%),fdgname$(i%),zinssatz#(i%)  ! Fdgname nur bei fdgart()=14
  5440.         INPUT #1,dummy$  ! Zinsdatum tt.mm.jj
  5441.         @datum_aufspalten(dummy$,t%,m%,y%)
  5442.         @tag_absolut(t%,m%,y%,dummy%)
  5443.         zinsdatum%(i%)=dummy%
  5444.         INPUT #1,fdgart#(i%),dummy$,dummy#,dummy$
  5445.         EXIT IF EOF(#1)=TRUE
  5446.         INC i%
  5447.         IF i%>maximalbuchungen%-2
  5448.           dummy%=@rsc_alert(1,"Die Forderungsberechnung|ist zu groß !|Bitte max. Buchungszeilen in|'Standards-Speichereinteilung'|auf größeren Wert einstellen.","[Abbruch",1)
  5449.           diskladenabbruch%=TRUE
  5450.           GOSUB neuberechnung(1)
  5451.           GOSUB forderungstextfeld
  5452.           EXIT IF 0=0
  5453.         ENDIF
  5454.       LOOP
  5455.       GOSUB zeileloeschen(i%)   ! LÖSCHT DAS "***" WIEDER RAUS
  5456.       DEFMOUSE 0
  5457.     ELSE ! ALSO VERSION 2.0 ODER GRÖSSER
  5458.       dateiversion#=dummy#  ! also erster geladener Wert der Datei
  5459.       ' LADEN VON AUFSTELLUNGEN VERSION 2.XX
  5460.       ' Dateiheader
  5461.       INPUT #1,mitmwst%,verrechnungsart# ! ZUR VORSELEKTIERUNG
  5462.       INPUT #1,mb_agzahl%,mb_aszahl%
  5463.       INPUT #1,az$,vollstreckungsgerichtanrede1$,vollstreckungsgerichtanrede2$,vollstreckungsgerichtstrasse$,vollstreckungsgerichtort$
  5464.       INPUT #1,glaeubigeranrede1$,glaeubigeranrede2$,glaeubigerstrasse$,glaeubigerort$,glaeubigergf1$,glaeubigergf2$
  5465.       INPUT #1,schuldneranrede1$,schuldneranrede2$,schuldnerstrasse$,schuldnerort$,schuldnergf1$,schuldnergf2$
  5466.       INPUT #1,titelart$,titelgericht$,titelort$,titeldatum$,titelaz$
  5467.       INPUT #1,drittschuldneranrede1$,drittschuldneranrede2$,drittschuldnerstrasse$,drittschuldnerort$,drittschuldnergf1$,drittschuldnergf2$
  5468.       i%=freiezeile%
  5469.       DO
  5470.         EXIT IF EOF(#1)=TRUE
  5471.         INPUT #1,betrag#(i%),restbetrag#(i%),zinssatz#(i%),fdgart#(i%)
  5472.         IF fdgart#(i%)=14 ! Forderungspopup >> Klartext
  5473.           INPUT #1,fdgname$(i%)
  5474.         ENDIF
  5475.         INPUT #1,fdgdatum%(i%),zinsdatum%(i%)
  5476.         EXIT IF EOF(#1)=TRUE
  5477.         INC i%
  5478.         IF i%>maximalbuchungen%-2
  5479.           dummy%=@rsc_alert(1,"Die Forderungsberechnung|ist zu groß !|Bitte max. Buchungszeilen in|'Standards-Speichereinteilung'|auf größeren Wert einstellen.","[Abbruch",1)
  5480.           diskladenabbruch%=TRUE
  5481.           GOSUB neuberechnung(1)
  5482.           GOSUB forderungstextfeld
  5483.           EXIT IF 0=0
  5484.         ENDIF
  5485.       LOOP
  5486.     ENDIF
  5487.     CLOSE #1
  5488.   ELSE  ! ALSO DATEINAME EXISTIERT NICHT
  5489.     dummy%=@rsc_alert(1,"Die gewählte Datei|existiert nicht !","[Abbruch",1)
  5490.     diskladenabbruch%=TRUE
  5491.   ENDIF
  5492. diskladenende:
  5493.   DEFMOUSE 0
  5494.   ON ERROR GOSUB fehler  ! Wieder rücksetzen
  5495. RETURN
  5496. ' ************************************************************************
  5497. > PROCEDURE diskladenerror
  5498.   dummy%=@rsc_alert(1,"Die gewählte Datei|"+RIGHT$(dateiname$,RINSTR(dateiname$,"\"))+"|hat falsches Format.","[Abbruch",1)
  5499.   CLOSE #1
  5500.   RESUME diskladenende
  5501. RETURN
  5502. ' ************************************************************************
  5503. > PROCEDURE diskspeichern
  5504.   ' ==============
  5505.   ' PFADBESTIMMUNG
  5506.   ' ==============
  5507.   IF dateiname$=""  !ALSO BEI NEUEN ABRECHNUNGEN
  5508.     pfad$=boot_pfad$+"\*.DAT"
  5509.   ELSE  ! FALLS EINE GELADENE ABRECHNUNG VORLIEGT
  5510.     backslash_pos%=RINSTR(dateiname$,"\")
  5511.     pfad$=LEFT$(dateiname$,backslash_pos%)+"*.DAT"
  5512.   ENDIF
  5513.   ' ================
  5514.   ' DATEINAME
  5515.   ' ================
  5516.   IF dateiname$<>""
  5517.     backslash_pos%=RINSTR(dateiname$,"\")
  5518.     voreinstellungsdateiname$=MID$(dateiname$,backslash_pos%+1)
  5519.   ELSE IF INSTR(az$,"./.")>0  ! also ein AZ mit ./. eingegeben ==> Vorschlag
  5520.     schuldnerpos%=INSTR(az$,"./.")+4  ! ./. und 1 Leerzeichen
  5521.     voreinstellungsdateiname$=MID$(az$,schuldnerpos%,8)  ! 8 Zeichen ohne Extender
  5522.     DO  ! Leerzeichen ersetzen
  5523.       lz_pos%=INSTR(voreinstellungsdateiname$," ")
  5524.       EXIT IF lz_pos%=0
  5525.       MID$(voreinstellungsdateiname$,lz_pos%,1)="_"
  5526.     LOOP
  5527.     DO   ! Punkte ersetzen
  5528.       punkt_pos%=INSTR(voreinstellungsdateiname$,".")
  5529.       EXIT IF punkt_pos%=0
  5530.       MID$(voreinstellungsdateiname$,punkt_pos%,1)="_"
  5531.     LOOP
  5532.     voreinstellungsdateiname$=voreinstellungsdateiname$+".DAT"
  5533.   ELSE
  5534.     voreinstellungsdateiname$=""
  5535.   ENDIF
  5536.   dateiname$=@fileselect$("Forderungsberechnung sichern",pfad$,voreinstellungsdateiname$)
  5537.   IF dateiname$="" OR RIGHT$(dateiname$)="\"
  5538.     GOTO diskspeichernende
  5539.   ELSE IF RIGHT$(dateiname$,3)="DOC" OR RIGHT$(dateiname$,3)="TXT"
  5540.     GOSUB als_text_speichern(0,dateiname$)
  5541.     dummy%=@rsc_alert(1,"Auch als Datendatei|speichern ?"," [Ja |[Nein]",1)
  5542.     IF dummy%=1
  5543.       a%=INSTR(dateiname$,".")
  5544.       dateiname$=LEFT$(dateiname$,a%)+"DAT"
  5545.     ELSE
  5546.       GOTO diskspeichernende
  5547.     ENDIF
  5548.   ELSE IF LEN(dateiname$)-RINSTR(dateiname$,".")>3  ! also ohne Extender
  5549.     dateiname$=dateiname$+".DAT"  ! dann Extender DAT anhängen
  5550.   ENDIF
  5551.   ' =================
  5552.   ' Sicherungsbackup
  5553.   ' ================
  5554.   IF EXIST(dateiname$)
  5555.     ' Testen, ob eventuell eine gleichnamige Datei anderen Inhalts überschrieben wird
  5556.     ' ########
  5557.     OPEN "I",#1,dateiname$
  5558.     INPUT #1,dummy% ! zum vorselektieren des MwStbuttons (KANN NUR 0 ODER 1 SEIN)
  5559.     IF dummy%>=2  ! ALSO AB VERSION 2.0 (dann Versionsnummer)
  5560.       INPUT #1,dummy%,dummy%,dummy%,dummy%  ! mitmwst und verrechnungsart
  5561.       ' und mb_antragsgegnerzahl und -stellerzahl
  5562.     ENDIF
  5563.     ' #########
  5564.     INPUT #1,vergleichsaz$
  5565.     CLOSE #1
  5566.     IF vergleichsaz$<>az$
  5567.       dummy%=@rsc_alert(1,"Eine andere Datei|mit gleichem Namen,|aber anderem Aktenzeichen|existiert. Überschreiben ?","[OK|[Abbruch",1)
  5568.       IF dummy%=2
  5569.         GOTO diskspeichernende
  5570.       ENDIF
  5571.     ENDIF
  5572.     '
  5573.     punktpos%=RINSTR(dateiname$,".")
  5574.     backupname$=LEFT$(dateiname$,punktpos%)+"BAK"
  5575.     IF EXIST(backupname$)
  5576.       KILL backupname$  ! Altes Backup löschen
  5577.     ENDIF
  5578.     RENAME dateiname$ AS backupname$  ! Umbenennen der alten Datendatei als BAK
  5579.   ENDIF
  5580.   ' ================
  5581.   ' SPEICHERN
  5582.   ' ============
  5583.   ' BEI VERSION 2.0 NEUES SPEICHERFORMAT
  5584.   '
  5585.   GOSUB mausform(8)  ! DISKETTE
  5586.   OPEN "O",#1,dateiname$
  5587.   aufstellungsaenderung#=FALSE  ! da ja bereits abgespeichert wurde
  5588.   WRITE #1,version# ! ZUM ERKENNEN SPÄTERER FORMATÄNDERUNGEN
  5589.   ' Dateiheader, FALLDATEN USW.
  5590.   WRITE #1,mitmwst%,verrechnungsart# ! ZUR VORSELEKTIERUNG
  5591.   WRITE #1,mb_agzahl%,mb_aszahl%
  5592.   WRITE #1,az$,vollstreckungsgerichtanrede1$,vollstreckungsgerichtanrede2$,vollstreckungsgerichtstrasse$,vollstreckungsgerichtort$
  5593.   WRITE #1,glaeubigeranrede1$,glaeubigeranrede2$,glaeubigerstrasse$,glaeubigerort$,glaeubigergf1$,glaeubigergf2$
  5594.   WRITE #1,schuldneranrede1$,schuldneranrede2$,schuldnerstrasse$,schuldnerort$,schuldnergf1$,schuldnergf2$
  5595.   WRITE #1,titelart$,titelgericht$,titelort$,titeldatum$,titelaz$
  5596.   WRITE #1,drittschuldneranrede1$,drittschuldneranrede2$,drittschuldnerstrasse$,drittschuldnerort$,drittschuldnergf1$,drittschuldnergf2$
  5597.   ' AUFSTELLUNGSDATEN
  5598.   FOR i%=1 TO maximalbuchungen%
  5599.     EXIT IF fdgart#(i%)=0  ! WENN KEINE FORDERUNG DRINSTEHT,IST DAS FELD ZU ENDE
  5600.     WRITE #1,betrag#(i%),restbetrag#(i%),zinssatz#(i%),fdgart#(i%)
  5601.     IF fdgart#(i%)=14  ! Forderungsartpopup >> Klartext speichern
  5602.       WRITE #1,fdgname$(i%)
  5603.     ENDIF
  5604.     WRITE #1,fdgdatum%(i%),zinsdatum%(i%)
  5605.   NEXT i%
  5606.   TOUCH #1  ! Dateidatum aktualisieren
  5607.   CLOSE #1
  5608. diskspeichernende:
  5609.   DEFMOUSE 0
  5610. RETURN
  5611. ' ************************************************************************
  5612. > PROCEDURE als_text_speichern(filesel%,ausgabedatei$)  ! Nur die reine Forderungsaufstellung
  5613.   IF filesel%=0  ! Dann keine Fileselectbox öffnen, dateiname wird übergeben
  5614.     ' Dann nur die Aufstellung selbst speichern, nicht den ganzen Rest
  5615.     GOSUB mausform(8)
  5616.     OPEN "O",#1,ausgabedatei$
  5617.     PRINT #1," NR.  DATUM     HAUPTFDG    KOSTEN    ZINSEN  K-ZINS ANMERKUNGEN"
  5618.     FOR j%=1 TO maximalbuchungen%
  5619.       PRINT #1,fdgtxt$(j%)
  5620.       EXIT IF fdgtxt$(j%+1)="" AND fdgtxt$(j%+2)=""  ! d. h. Zwei Leerzeilen
  5621.     NEXT j%
  5622.     CLOSE #1
  5623.   ELSE IF filesel%=1   ! Dann Fileselectbox öffnen
  5624.     pfad#=GEMDOS(25)+65
  5625.     pfad$=CHR$(pfad#)+":"+DIR$(0)+"\*.TXT"
  5626.     ausgabedatei$=@fileselect$("Ausgabedatei bestimmen",pfad$,"AUSGABE.TXT")
  5627.     IF ausgabedatei$="" OR RIGHT$(ausgabedatei$)="\"
  5628.       GOTO als_text_speichern_ende
  5629.     ENDIF
  5630.     GOSUB mausform(8)
  5631.     OPEN "O",#1,ausgabedatei$
  5632.     PRINT #1,ausgabe$  ! wurde vor dem Aufruf vorbereitet
  5633.     CLOSE #1
  5634.   ELSE IF filesel%=2   ! Dann aufs Clipboard schreiben
  5635.     @clipboardpfad_finden
  5636.     @clipboard_aufraeumen
  5637.     ausgabedatei$=clipboarddateiname$
  5638.     GOSUB mausform(8)
  5639.     OPEN "O",#1,ausgabedatei$
  5640.     PRINT #1,ausgabe$  ! wurde vor dem Aufruf vorbereitet
  5641.     CLOSE #1
  5642.   ENDIF
  5643. als_text_speichern_ende:
  5644.   DEFMOUSE 0
  5645. RETURN
  5646. ' **************************************************
  5647. > PROCEDURE clipboardpfad_finden
  5648.   ' Pfad ohne Backslash am Ende !!!
  5649.   '
  5650.   ' Wenn es schon einen Clipboardpfad gibt, diesen unterstützen
  5651.   back#=SCRP_READ(clipboardpfad$)
  5652.   clipboardpfad$=TRIM$(clipboardpfad$)  ! Leerzeichen vorn + hinten entfernen
  5653.   '
  5654.   '
  5655.   IF LEN(clipboardpfad$)>0  ! also gibt es auch den Pfad
  5656.     IF RIGHT$(clipboardpfad$,1)="\"  ! Backslash am Ende abschneiden
  5657.       clipboardpfad$=LEFT$(clipboardpfad$,LEN(clipboardpfad$)-1)
  5658.     ENDIF
  5659.     clipboarddateiname$=clipboardpfad$+"\SCRAP.TXT"
  5660.     '
  5661.     ' Ordner (Name ohne Backslash) vorhanden ?
  5662.     ordnername#=FSFIRST(clipboardpfad$,16)
  5663.     IF ordnername#=0  ! kein Error, also gefunden
  5664.       GOSUB clipboard_aufraeumen
  5665.     ELSE   ! es existiert noch kein Ordner
  5666.       clipboardpfad$="C:\CLIPBRD"  ! im Obersten Verzeichnis
  5667.       clipboarddateiname$=clipboardpfad$+"\SCRAP.TXT"
  5668.       dummy%=FSFIRST(clipboardpfad$,16)  ! existiert der Ordner Clipboard ?
  5669.       IF dummy%<>0  ! Pfad nicht gefunden; Ordner gibt's nicht
  5670.         MKDIR "C:\CLIPBRD"
  5671.       ELSE
  5672.         GOSUB clipboard_aufraeumen
  5673.       ENDIF
  5674.     ENDIF
  5675.   ELSE   ! es existiert noch kein Scrapverzeichnis
  5676.     clipboardpfad$="C:\CLIPBRD"  ! in oberster Ebene
  5677.     clipboarddateiname$=clipboardpfad$+"\SCRAP.TXT"
  5678.     dummy%=FSFIRST(clipboardpfad$,16)  ! existiert der Ordner Clipboard ?
  5679.     IF dummy%<>0  ! Pfad nicht gefunden; Ordner gibt's nicht
  5680.       MKDIR "C:\CLIPBRD"  ! Also anlegen
  5681.     ELSE
  5682.       GOSUB clipboard_aufraeumen
  5683.     ENDIF
  5684.   ENDIF
  5685.   back#=SCRP_WRITE(clipboardpfad$)  ! anderen Anwendungen mitteilen
  5686. RETURN
  5687. ' ************************************************
  5688. > PROCEDURE clipboard_aufraeumen
  5689.   ' Bereits vorhandene Clipboarddateien entfernen
  5690.   dateiname#=FSFIRST(clipboardpfad$+"\*.*",47) ! 63-16=47 ; also keine Ordner
  5691.   IF dateiname#=0  ! es gibt eine Datei
  5692.     dateiname$=clipboardpfad$+"\"+CHAR{FGETDTA()+30}
  5693.     KILL dateiname$
  5694.     DO
  5695.       dateiname#=FSNEXT()
  5696.       EXIT IF dateiname#<>0  ! alle sind gelöscht
  5697.       dateiname$=clipboardpfad$+"\"+CHAR{FGETDTA()+30}
  5698.       KILL dateiname$
  5699.     LOOP
  5700.   ENDIF
  5701. RETURN
  5702. ' ******************************************************
  5703. > PROCEDURE nachtexte_laden
  5704.   ' +++++++++++++++++
  5705.   ' Alten Pfad retten
  5706.   ' +++++++++++++++++
  5707.   alt_pfad$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)
  5708.   ' +++++++++++++++++++
  5709.   ' MUSTERTEXTE
  5710.   ' ++++++++++++++++++++
  5711.   ' WECHSELN IN DEN PFAD WO DIE MUSTER SIND
  5712.   CHDIR alt_pfad$+"\PRT\MUSTER\"
  5713.   '
  5714.   ' Die Indices von Muster$ sind dieselben wie die Variable wasdrucken%
  5715. mustertextdateinamen:
  5716.   DATA 367,ZVA,PFUEB,EV,PFVERHFT,DURCHSUC,ZAHLVERB,ZPO_840,POSTANFR,EMA
  5717.   DATA ZV_DROHG,RATENVGL,SICHHYPO,SICHVSTR,VERHAFTG,EV_ERGNZ,EV_NEU
  5718.   RESTORE mustertextdateinamen
  5719.   FOR i%=1 TO 17
  5720.     READ a$
  5721.     GOSUB text_in_string_laden(a$+".MST",b$)
  5722.     muster$(i%)=b$
  5723.   NEXT i%
  5724.   '
  5725.   ' muster$(28) ist für Anwendertexte aus der Muster-Bibliothek reserviert (*.MSB)
  5726.   '
  5727.   ' Kurzdruck
  5728.   GOSUB text_in_string_laden("KURZDRK.MST",b$)
  5729.   muster$(29)=b$
  5730.   ' MB-Muster
  5731.   GOSUB text_in_string_laden("MB.MST",b$)
  5732.   muster$(30)=b$  ! Index des MB=30
  5733.   ' VB-Muster
  5734.   GOSUB text_in_string_laden("VB.MST",b$)
  5735.   muster$(31)=b$  ! Index des VB=31
  5736.   ' CMB-Muster
  5737.   GOSUB text_in_string_laden("CMB.MST",b$)
  5738.   muster$(32)=b$  ! Index des MB=32
  5739.   '
  5740.   ' +++++++++++++++++++++
  5741.   ' ABKÜRZUNGEN
  5742.   ' +++++++++++++++++++++
  5743.   ' WECHSELN IN DEN PFAD WO DIE MUSTER SIND
  5744.   CHDIR alt_pfad$+"\PRT\"
  5745.   ' ABKUERZG.TXT
  5746.   GOSUB text_in_string_laden("ABKUERZG.TXT",abk$)
  5747.   '
  5748.   '
  5749.   ' +++++++++++++++++++
  5750.   ' ANSPRUCHS-Texte Laden; Index entspr. welcher_anspruch%
  5751.   ' ++++++++++++++++
  5752.   ' WECHSELN IN DEN PFAD WO DIE ANSPRUCHSTEXTE SIND
  5753.   CHDIR alt_pfad$+"\PRT\ANSPRUCH\"
  5754.   '
  5755. anspruchstextdateinamen:
  5756.   DATA ARBEITSA,ARBGEBER,BANK,FINNZAMT,LEBENSVS,RENTE,WERKLOHN,ANDERES
  5757.   RESTORE anspruchstextdateinamen
  5758.   FOR i%=1 TO 8
  5759.     READ a$
  5760.     GOSUB text_in_string_laden(a$+".TXT",b$)
  5761.     anspruch$(i%)=b$
  5762.   NEXT i%
  5763.   '
  5764.   ' ++++++++++++++++++
  5765.   ' Zurück zum alten Pfad
  5766.   ' +++++++++++++++++
  5767.   CHDIR alt_pfad$
  5768. RETURN
  5769. ' ******************************************************************+
  5770. > PROCEDURE text_in_string_laden(name_der_datei$,VAR r$)
  5771.   IF EXIST(name_der_datei$)
  5772.     OPEN "I",#1,name_der_datei$
  5773.     l%=LOF(#1)
  5774.     r$=INPUT$(l%,#1)
  5775.   ELSE
  5776.     a$="Hilfsdatei "+name_der_datei$+"|wurde nicht gefunden !|Bitte erzeugen und neu starten."
  5777.     ~@rsc_alert(1,a$," [OK ",1)
  5778.   ENDIF
  5779.   CLOSE #1
  5780. RETURN
  5781. ' ************************************************************************
  5782. > PROCEDURE optionenladen
  5783.   optionsdateiname$=boot_pfad$+"\PRT\STANDARD.OPT"
  5784.   IF EXIST(optionsdateiname$)
  5785.     OPEN "I",#1,optionsdateiname$
  5786.     INPUT #1,dateiversion#  ! Damit bei künftigen Versionen Änderungen erkannt werden
  5787.     INPUT #1,seitenlaenge%,abstand_von_oben%,abstand_kopf_vom_oberen_druckrand%,abstand_fusszeile%,abstand_von_unten%,zeichen_pro_zeile%,abstand_von_links%
  5788.     INPUT #1,mb_seitenlaenge%,mb_abstand_von_oben%,mb_abstand_von_links%,gerichtszustellung%
  5789.     INPUT #1,cmb_seitenlaenge%,cmb_abstand_von_oben%,cmb_abstand_von_links%
  5790.     INPUT #1,kopienzahl367%,kopienzahlzva%,kopienzahlpfueb%,kopienzahleva%,kopienzahlpfverh%,kopienzahldurchs%
  5791.     INPUT #1,kopienzahlzahlverb%,kopienzahl840%,kopienzahlpanfr%,kopienzahlema%,kopienzahlzvandrohg%,kopienzahlratenvgl%,kopienzahlsihyp%,kopienzahlsivollstr%
  5792.     INPUT #1,useranrede1$,useranrede2$,userstr$,userort$,userkto$,userbank$,userblz$,standardverrechnungsart#
  5793.     INPUT #1,standardadressatanrede1$,standardadressatanrede2$,standardadressatstrasse$,standardadressatort$
  5794.     INPUT #1,mwstsatz#,gebpanfr#,gebema#,gkpfueb#,gkev#,gkzust#,ev_hoechstwert#
  5795.     INPUT #1,ostwestfaktor#,mwst_trotz_vorsteuerabzug%,vb_drucken%
  5796.     INPUT #1,unterschriftsleiste$,eigensache$
  5797.     INPUT #1,dialogpos%,seitennrjustierung%
  5798.     IF dateiversion#>2.05
  5799.       INPUT #1,fensterdial%
  5800.     ENDIF
  5801.     IF dateiversion#>3.2
  5802.       INPUT #1,druckport%
  5803.     ENDIF
  5804.     IF dateiversion#>4.2
  5805.       INPUT #1,copystop%
  5806.     ENDIF
  5807.     IF dateiversion#>4.61
  5808.       INPUT #1,maximalbuchungen%,max_adr%
  5809.     ELSE ! Voreinstellung wie früher
  5810.       maximalbuchungen%=1500
  5811.       max_adr%=1500
  5812.     ENDIF
  5813.     FOR i%=1 TO 20
  5814.       INPUT #1,ftaste$(i%)  ! F-Tastentexte
  5815.       KEYDEF i%,ftaste$(i%)
  5816.     NEXT i%
  5817.     CLOSE #1
  5818.   ELSE
  5819.     dummy%=@rsc_alert(1,"Datei STANDARD.OPT|(Optionsdatei) fehlt!"," [OK ",1)
  5820.   ENDIF
  5821. RETURN
  5822. ' ****************************************************************
  5823. > PROCEDURE optionenspeichern
  5824.   pfad#=GEMDOS(25)+65
  5825.   optionsdateiname$=boot_pfad$+"\PRT\STANDARD.OPT"
  5826.   OPEN "O",#1,optionsdateiname$
  5827.   WRITE #1,version#  ! Damit bei künftigen Versionen Änderungen erkannt werden
  5828.   WRITE #1,seitenlaenge%,abstand_von_oben%,abstand_kopf_vom_oberen_druckrand%,abstand_fusszeile%,abstand_von_unten%,zeichen_pro_zeile%,abstand_von_links%
  5829.   WRITE #1,mb_seitenlaenge%,mb_abstand_von_oben%,mb_abstand_von_links%,gerichtszustellung%
  5830.   WRITE #1,cmb_seitenlaenge%,cmb_abstand_von_oben%,cmb_abstand_von_links%
  5831.   WRITE #1,kopienzahl367%,kopienzahlzva%,kopienzahlpfueb%,kopienzahleva%,kopienzahlpfverh%,kopienzahldurchs%
  5832.   WRITE #1,kopienzahlzahlverb%,kopienzahl840%,kopienzahlpanfr%,kopienzahlema%,kopienzahlzvandrohg%,kopienzahlratenvgl%,kopienzahlsihyp%,kopienzahlsivollstr%
  5833.   WRITE #1,useranrede1$,useranrede2$,userstr$,userort$,userkto$,userbank$,userblz$,standardverrechnungsart#
  5834.   WRITE #1,standardadressatanrede1$,standardadressatanrede2$,standardadressatstrasse$,standardadressatort$
  5835.   WRITE #1,mwstsatz#,gebpanfr#,gebema#,gkpfueb#,gkev#,gkzust#,ev_hoechstwert#
  5836.   WRITE #1,ostwestfaktor#,mwst_trotz_vorsteuerabzug%,vb_drucken%
  5837.   WRITE #1,unterschriftsleiste$,eigensache$
  5838.   WRITE #1,dialogpos%,seitennrjustierung%,fensterdial%,druckport%,copystop%
  5839.   WRITE #1,maximalbuchungen%,max_adr%
  5840.   FOR i%=1 TO 20
  5841.     WRITE #1,ftaste$(i%)  ! F-Tastentexte
  5842.   NEXT i%
  5843.   CLOSE #1
  5844. RETURN
  5845. ' ***************************************************************
  5846. > PROCEDURE diskontsaetze_laden
  5847.   ' Das Feld diskont enthält das Datum(absolut) als (i%,1) und den Zinssatz in % (i%,2)
  5848.   pfad#=GEMDOS(25)+65
  5849.   diskontzinsdateiname$=boot_pfad$+"\PRT\DISKONT.ZIN"
  5850.   IF EXIST(diskontzinsdateiname$)
  5851.     OPEN "I",#1,diskontzinsdateiname$
  5852.     INPUT #1,diskontversion#  ! Damit bei künftigen Versionen Änderungen erkannt werden
  5853.     i%=1
  5854.     DO
  5855.       EXIT IF EOF(#1)
  5856.       INPUT #1,diskont#(i%,1),diskont#(i%,2)  ! Datum (absolut und Zinssatz)
  5857.       INC i%
  5858.     LOOP
  5859.   ELSE
  5860.     ~@rsc_alert(1,"Diskontzins-Datei ist nicht vorhanden."," [OK ",1)
  5861.   ENDIF
  5862.   CLOSE #1
  5863. RETURN
  5864. ' *********************************************************************
  5865. > PROCEDURE diskontsaetze_speichern
  5866.   GOSUB mausform(8)  ! DISKETTE
  5867.   pfad#=GEMDOS(25)+65
  5868.   diskontzinsdateiname$=boot_pfad$+"\PRT\DISKONT.ZIN"
  5869.   OPEN "O",#1,diskontzinsdateiname$
  5870.   WRITE #1,version#  ! Damit bei künftigen Versionen Änderungen erkannt werden
  5871.   i%=1
  5872.   DO
  5873.     EXIT IF diskont#(i%,2)=0  ! Also kein Zinssatz
  5874.     WRITE #1,diskont#(i%,1),diskont#(i%,2)  ! Datum (absolut und Zinssatz)
  5875.     INC i%
  5876.   LOOP
  5877.   CLOSE #1
  5878.   DEFMOUSE 0
  5879. RETURN
  5880. ' ************************************************************+
  5881. '
  5882. ' BERECHNUNG DER FORDERUNGSAUFSTELLUNG INCL. ZINSBERECHNUNG
  5883. '
  5884. ' **************************************************************
  5885. > PROCEDURE summenbildung(zeilefdgart20%,VAR hfsum#,kostsum#,hfzsum#,kostzsum#)
  5886.   LOCAL i%  ! Damit es nicht woanders verbogen wird !!!
  5887.   ' suchen der letzten Summenzeile (nach verrechnung)
  5888.   FOR i%=zeilefdgart20%-1 DOWNTO 0  ! in Zeile 0 steht nichts, also Altzinsen=0
  5889.     summenzeilennr%=i%
  5890.     EXIT IF fdgart#(i%)=22  ! wenn Summenzeile vorliegt, ist fdgart=22
  5891.   NEXT i%
  5892.   ' SUMMENZEILENNR% = 0 BEI ERSTER ZAHLUNG
  5893.   hfzsum#=zinssatz#(summenzeilennr%)  ! also null, falls erste Zahlung
  5894.   kostzsum#=kzins#(summenzeilennr%) ! ALSO 0 FALLS ERSTE ZAHLUNG
  5895.   ' HF-Zinsen
  5896.   FOR i%=1 TO zeilefdgart20%-1
  5897.     IF fdgart#(i%)=1  ! also HF
  5898.       IF zinssatz#(i%)>0  !also verzinslich, aber kein Scheckzins (der ist negativ)
  5899.         IF summenzeilennr%<>0  ! also Bearbeiten einer anderen als der ersten Zahlung
  5900.           IF fdgdatum%(i%)<=fdgdatum%(summenzeilennr%)
  5901.             ' War die Forderung schon vor der Summenzeile da ?
  5902.             ' ÄNDERUNG !!!
  5903.             ' Forderung war vor der Summenzeile da >> Zinsen ab Summenzeile
  5904.             ' allerdings nur, wenn zinsdatum auch vor Summenzeile lag, sonst
  5905.             ' muß das Zinsdatum genommen werden !!!
  5906.             IF zinsdatum%(i%)<=fdgdatum%(summenzeilennr%)
  5907.               GOSUB zinstage(fdgdatum%(summenzeilennr%),fdgdatum%(zeilefdgart20%),ztage%)
  5908.             ELSE
  5909.               GOSUB zinstage(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),ztage%)
  5910.             ENDIF
  5911.           ELSE
  5912.             GOSUB zinstage(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),ztage%)
  5913.             ' FALLS DIE FORDERUNG NACH DER LETZTEN SUMME DAZUKAM
  5914.           ENDIF
  5915.           zins#=ztage%/360*restbetrag#(i%)*zinssatz#(i%)/100  ! Zinsformel mit Restbetrag
  5916.           zins#=ROUND(zins#,2)  !=(INT(zins*100+0.5))/100  ! Rundung auf Pfennige
  5917.           ADD hfzsum#,zins#
  5918.         ELSE  ! Also die erste Zahlung
  5919.           GOSUB zinstage(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),ztage%) ! also 1. Buchung
  5920.           zins#=ztage%/360*restbetrag#(i%)*zinssatz#(i%)/100  ! Zinsformel mit Restbetrag
  5921.           zins#=ROUND(zins#,2)  !=(INT(zins*100+0.5))/100  ! Rundung auf Pfennige
  5922.           ADD hfzsum#,zins#
  5923.         ENDIF
  5924.       ELSE IF zinssatz#(i%)<0  ! Also SCHECKZINS (negativer Zinssatz)
  5925.         IF summenzeilennr%<>0  ! also Bearbeiten einer anderen als der ersten Zahlung
  5926.           IF fdgdatum%(i%)<=fdgdatum%(summenzeilennr%)
  5927.             ' War die Forderung schon vor der Summenzeile da ?
  5928.             ' AUFRUF von Scheckzinsen: Abdat,bisdat,restbetrag,VAR zins
  5929.             ' Forderung war vor der Summenzeile da >> Zinsen ab Summenzeile
  5930.             ' allerdings nur, wenn zinsdatum auch vor Summenzeile lag, sonst
  5931.             ' muß das Zinsdatum genommen werden !!!
  5932.             IF zinsdatum%(i%)<=fdgdatum%(summenzeilennr%)
  5933.               GOSUB scheckzinsen(fdgdatum%(summenzeilennr%),fdgdatum%(zeilefdgart20%),restbetrag#(i%),zinssatz#(i%)*-1,zins#)
  5934.             ELSE
  5935.               GOSUB scheckzinsen(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),restbetrag#(i%),zinssatz#(i%)*-1,zins#)
  5936.             ENDIF
  5937.             '
  5938.           ELSE
  5939.             GOSUB scheckzinsen(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),restbetrag#(i%),zinssatz#(i%)*-1,zins#)
  5940.             ' FALLS DIE FORDERUNG NACH DER LETZTEN SUMME DAZUKAM
  5941.           ENDIF
  5942.           ADD hfzsum#,zins#
  5943.         ELSE  ! Also die erste Zahlung
  5944.           GOSUB scheckzinsen(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),restbetrag#(i%),zinssatz#(i%)*-1,zins#)
  5945.           ADD hfzsum#,zins#
  5946.         ENDIF
  5947.       ENDIF
  5948.     ENDIF
  5949.     '
  5950.     ' KOSTENZINSEN
  5951.     IF fdgart#(i%)>1 AND fdgart#(i%)<15  ! also Kosten incl. Nebenfdg
  5952.       IF zinssatz#(i%)>0  !also verzinslich, aber kein Scheckzins (der ist negativ)
  5953.         IF summenzeilennr%<>0  ! also Bearbeiten einer anderen als der ersten Zahlung
  5954.           IF fdgdatum%(i%)<=fdgdatum%(summenzeilennr%)
  5955.             ' War die Forderung schon vor der Summenzeile da ?
  5956.             ' ÄNDERUNG !!!
  5957.             ' Forderung war vor der Summenzeile da >> Zinsen ab Summenzeile
  5958.             ' allerdings nur, wenn zinsdatum auch vor Summenzeile lag, sonst
  5959.             ' muß das Zinsdatum genommen werden !!!
  5960.             IF zinsdatum%(i%)<=fdgdatum%(summenzeilennr%)
  5961.               GOSUB zinstage(fdgdatum%(summenzeilennr%),fdgdatum%(zeilefdgart20%),ztage%)
  5962.             ELSE
  5963.               GOSUB zinstage(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),ztage%)
  5964.             ENDIF
  5965.           ELSE
  5966.             GOSUB zinstage(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),ztage%)
  5967.             ' FALLS DIE FORDERUNG NACH DER LETZTEN SUMME DAZUKAM
  5968.           ENDIF
  5969.           zins#=ztage%/360*restbetrag#(i%)*zinssatz#(i%)/100  ! Zinsformel mit Restbetrag
  5970.           zins#=ROUND(zins#,2)  !=(INT(zins*100+0.5))/100  ! Rundung auf Pfennige
  5971.           ADD kostzsum#,zins#
  5972.         ELSE  ! Also die erste Zahlung
  5973.           GOSUB zinstage(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),ztage%) ! also 1. Buchung
  5974.           zins#=ztage%/360*restbetrag#(i%)*zinssatz#(i%)/100  ! Zinsformel mit Restbetrag
  5975.           zins#=ROUND(zins#,2)  !=(INT(zins*100+0.5))/100  ! Rundung auf Pfennige
  5976.           ADD kostzsum#,zins#
  5977.         ENDIF
  5978.       ELSE IF zinssatz#(i%)<0  ! Also SCHECKZINS
  5979.         IF summenzeilennr%<>0  ! also Bearbeiten einer anderen als der ersten Zahlung
  5980.           IF fdgdatum%(i%)<=fdgdatum%(summenzeilennr%)
  5981.             ' War die Forderung schon vor der Summenzeile da ?
  5982.             ' AUFRUF von Scheckzinsen: Abdat,bisdat,restbetrag,VAR zins
  5983.             ' Forderung war vor der Summenzeile da >> Zinsen ab Summenzeile
  5984.             ' allerdings nur, wenn zinsdatum auch vor Summenzeile lag, sonst
  5985.             ' muß das Zinsdatum genommen werden !!!
  5986.             IF zinsdatum%(i%)<=fdgdatum%(summenzeilennr%)
  5987.               GOSUB scheckzinsen(fdgdatum%(summenzeilennr%),fdgdatum%(zeilefdgart20%),restbetrag#(i%),zinssatz#(i%)*-1,zins#)
  5988.             ELSE
  5989.               GOSUB scheckzinsen(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),restbetrag#(i%),zinssatz#(i%)*-1,zins#)
  5990.             ENDIF
  5991.           ELSE
  5992.             GOSUB scheckzinsen(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),restbetrag#(i%),zinssatz#(i%)*-1,zins#)
  5993.             ' FALLS DIE FORDERUNG NACH DER LETZTEN SUMME DAZUKAM
  5994.           ENDIF
  5995.           ADD kostzsum#,zins#
  5996.         ELSE  ! Also die erste Zahlung
  5997.           GOSUB scheckzinsen(zinsdatum%(i%),fdgdatum%(zeilefdgart20%),restbetrag#(i%),zinssatz#(i%)*-1,zins#)
  5998.           ADD kostzsum#,zins#
  5999.         ENDIF
  6000.       ENDIF
  6001.     ENDIF
  6002.   NEXT i%
  6003.   hfsum#=0
  6004.   kostsum#=0
  6005.   FOR i%=1 TO zeilefdgart20%-1
  6006.     IF fdgart#(i%)=1  ! Forderungsart Hauptforderung
  6007.       ADD hfsum#,restbetrag#(i%)
  6008.     ENDIF
  6009.     IF fdgart#(i%)>1 AND fdgart#(i%)<15 ! Forderungsart Kosten (15 und 16 = Zahlung)
  6010.       ADD kostsum#,restbetrag#(i%)
  6011.     ENDIF
  6012.   NEXT i%
  6013.   hfsum#=ROUND(hfsum#,2)
  6014.   kostsum#=ROUND(kostsum#,2)
  6015.   hfzsum#=ROUND(hfzsum#,2)
  6016.   kostzsum#=ROUND(kostzsum#,2)
  6017. RETURN
  6018. ' **************************************************************************
  6019. > PROCEDURE verrechnung(zahlungszeilennr%,VAR ahf#,ak#,ahfz#,akz#,zuvielgezahlt#)
  6020.   LOCAL k%
  6021.   CLR ahf#,ak#,ahfz#,akz#
  6022.   hfdm#=betrag#(zahlungszeilennr%-1)
  6023.   kostdm#=restbetrag#(zahlungszeilennr%-1)
  6024.   hfz#=zinssatz#(zahlungszeilennr%-1)
  6025.   kostz#=kzins#(zahlungszeilennr%-1)
  6026.   zahlungsbetrag#=betrag#(zahlungszeilennr%)
  6027.   restzahlungsbetrag#=zahlungsbetrag#
  6028.   IF verrechnungsart#=2  ! Beschißverrechnung
  6029.     ' ========================================
  6030.     ' 1. VERRECHNUNG AUF UNVERZINSLICHE KOSTEN
  6031.     FOR k%=1 TO zahlungszeilennr%-2
  6032.       IF fdgart#(k%)>1 AND fdgart#(k%)<15  ! ALSO KOSTEN
  6033.         IF zinssatz#(k%)=0  ! ALSO UNVERZINSLICH
  6034.           IF restzahlungsbetrag#>=restbetrag#(k%)   !REST > KOSTENRESTBETRAG
  6035.             ADD ak#,restbetrag#(k%)  ! AUF KOSTEN VOLL VERRRECHNET
  6036.             restzahlungsbetrag#=restzahlungsbetrag#-restbetrag#(k%)
  6037.             restbetrag#(k%)=0
  6038.           ELSE  ! ALSO RESTZAHLUNG < ALS KOSTENPOSTEN
  6039.             ADD ak#,restzahlungsbetrag#
  6040.             restbetrag#(k%)=restbetrag#(k%)-restzahlungsbetrag#
  6041.             restzahlungsbetrag#=0
  6042.           ENDIF
  6043.         ENDIF
  6044.       ENDIF
  6045.       EXIT IF restzahlungsbetrag#=0
  6046.     NEXT k%
  6047.     ' 2. VERRECHNUNG AUF KOSTENZINSEN
  6048.     IF restzahlungsbetrag#>=kostz#
  6049.       restzahlungsbetrag#=restzahlungsbetrag#-kostz#
  6050.       akz#=kostz#
  6051.     ELSE
  6052.       akz#=restzahlungsbetrag#
  6053.       restzahlungsbetrag#=0
  6054.     ENDIF
  6055.     ' 3. VERRECHNUNG AUF VERZINSLICHE KOSTEN
  6056.     FOR k%=1 TO zahlungszeilennr%-2
  6057.       IF fdgart#(k%)>1 AND fdgart#(k%)<15  ! ALSO KOSTEN
  6058.         IF zinssatz#(k%)<>0  ! ALSO VERZINSLICH
  6059.           IF restzahlungsbetrag#>=restbetrag#(k%)   !REST > KOSTENRESTBETRAG
  6060.             ADD ak#,restbetrag#(k%)  ! AUF KOSTEN VOLL VERRRECHNET
  6061.             restzahlungsbetrag#=restzahlungsbetrag#-restbetrag#(k%)
  6062.             restbetrag#(k%)=0
  6063.           ELSE  ! ALSO RESTZAHLUNG < ALS KOSTENPOSTEN
  6064.             ADD ak#,restzahlungsbetrag#
  6065.             restbetrag#(k%)=restbetrag#(k%)-restzahlungsbetrag#
  6066.             restzahlungsbetrag#=0
  6067.           ENDIF
  6068.         ENDIF
  6069.       ENDIF
  6070.       EXIT IF restzahlungsbetrag#=0
  6071.     NEXT k%
  6072.     ' =============================================================
  6073.     ' =============================================================
  6074.   ELSE   ! KORREKTE BERECHNUNG NACH § 367 immer wenn keine Beschißverrechnung
  6075.     ' also auch bei Verbraucherkreditgesetzverrechnung !
  6076.     ' 1. VERRECHNUNG AUF KOSTENZINSEN
  6077.     IF restzahlungsbetrag#>=kostz#
  6078.       restzahlungsbetrag#=restzahlungsbetrag#-kostz#
  6079.       akz#=kostz#
  6080.     ELSE
  6081.       akz#=restzahlungsbetrag#
  6082.       restzahlungsbetrag#=0
  6083.     ENDIF
  6084.     ' 2.+3. VERRECHNUNG AUF KOSTEN (egal ob mit oder ohne Zinsen)
  6085.     FOR k%=1 TO zahlungszeilennr%-2
  6086.       IF fdgart#(k%)>1 AND fdgart#(k%)<15  ! ALSO KOSTEN
  6087.         IF restzahlungsbetrag#>=restbetrag#(k%)   !REST > KOSTENRESTBETRAG
  6088.           ADD ak#,restbetrag#(k%)  ! AUF KOSTEN VOLL VERRRECHNET
  6089.           restzahlungsbetrag#=restzahlungsbetrag#-restbetrag#(k%)
  6090.           restbetrag#(k%)=0
  6091.         ELSE  ! ALSO RESTZAHLUNG < ALS KOSTENPOSTEN
  6092.           ADD ak#,restzahlungsbetrag#
  6093.           restbetrag#(k%)=restbetrag#(k%)-restzahlungsbetrag#
  6094.           restzahlungsbetrag#=0
  6095.         ENDIF
  6096.       ENDIF
  6097.       EXIT IF restzahlungsbetrag#=0
  6098.     NEXT k%
  6099.   ENDIF
  6100.   ' =========================================
  6101.   IF verrechnungsart#<>3  ! immer außer bei VerbrKredG (da erst auf hf, dann auf HF-Zinsen)
  6102.     ' 4. VERRECHNUNG AUF HF-ZINSEN
  6103.     IF restzahlungsbetrag#>=hfz#
  6104.       restzahlungsbetrag#=restzahlungsbetrag#-hfz#
  6105.       ahfz#=hfz#
  6106.     ELSE
  6107.       ahfz#=restzahlungsbetrag#
  6108.       restzahlungsbetrag#=0
  6109.     ENDIF
  6110.     ' =============================================================
  6111.     ' 5. VERRECHNUNG AUF HAUPTFORDERUNGEN (wegen datumssortierung wird immer auf die älteste zuerst verrechnet)
  6112.     FOR k%=1 TO zahlungszeilennr%-2
  6113.       IF fdgart#(k%)=1  ! ALSO HAUPTFORDERUNG
  6114.         IF restzahlungsbetrag#>=restbetrag#(k%)   !REST > HAUPTFORDERUNG
  6115.           ADD ahf#,restbetrag#(k%)  ! AUF HF VOLL VERRRECHNET
  6116.           restzahlungsbetrag#=restzahlungsbetrag#-restbetrag#(k%)
  6117.           restbetrag#(k%)=0
  6118.         ELSE  ! ALSO RESTZAHLUNG < ALS KOSTENPOSTEN
  6119.           ADD ahf#,restzahlungsbetrag#
  6120.           restbetrag#(k%)=restbetrag#(k%)-restzahlungsbetrag#
  6121.           restzahlungsbetrag#=0
  6122.         ENDIF
  6123.       ENDIF
  6124.       EXIT IF restzahlungsbetrag#=0
  6125.     NEXT k%
  6126.   ELSE IF verrechnungsart#=3  ! Kreditverbrauchergesetz
  6127.     ' 4. VERRECHNUNG AUF HAUPTFORDERUNGEN bei KrVerbrG _vor_ den HF-Zinsen !
  6128.     FOR k%=1 TO zahlungszeilennr%-2
  6129.       IF fdgart#(k%)=1  ! ALSO HAUPTFORDERUNG
  6130.         IF restzahlungsbetrag#>=restbetrag#(k%)   !REST > HAUPTFORDERUNG
  6131.           ADD ahf#,restbetrag#(k%)  ! AUF HF VOLL VERRRECHNET
  6132.           restzahlungsbetrag#=restzahlungsbetrag#-restbetrag#(k%)
  6133.           restbetrag#(k%)=0
  6134.         ELSE  ! ALSO RESTZAHLUNG < ALS KOSTENPOSTEN
  6135.           ADD ahf#,restzahlungsbetrag#
  6136.           restbetrag#(k%)=restbetrag#(k%)-restzahlungsbetrag#
  6137.           restzahlungsbetrag#=0
  6138.         ENDIF
  6139.       ENDIF
  6140.       EXIT IF restzahlungsbetrag#=0
  6141.     NEXT k%
  6142.     ' 5. VERRECHNUNG AUF HF-ZINSEN bei KredVerbrG nach der HF-Verrechnung
  6143.     IF restzahlungsbetrag#>=hfz#
  6144.       restzahlungsbetrag#=restzahlungsbetrag#-hfz#
  6145.       ahfz#=hfz#
  6146.     ELSE
  6147.       ahfz#=restzahlungsbetrag#
  6148.       restzahlungsbetrag#=0
  6149.     ENDIF  ! Ende der Verrechnungsartunterscheidung
  6150.   ENDIF
  6151.   zuvielgezahlt#=restzahlungsbetrag#
  6152. RETURN
  6153. ' ***********************************************************************
  6154. > PROCEDURE altergebniszeileloeschen(nr#) ! nr=letzte besetzte Zeile
  6155.   FOR z%=1 TO nr# ! Alte Endergebniszeile löschen
  6156.     IF fdgart#(z%)=25
  6157.       GOSUB zeileloeschen(z%)
  6158.       DEC z%  ! Da ja nachgerücht wurde
  6159.     ENDIF
  6160.   NEXT z%
  6161. RETURN
  6162. ' ***********************************************************************
  6163. > PROCEDURE ueberzahlungszeileloeschen(nr#) ! nr=letzte besetzte Zeile
  6164.   FOR z%=1 TO nr# ! Alte ÜBERZAHLUNGSzeile löschen
  6165.     IF fdgart#(z%)=23  !ÜBERZAHLUNGSZEILE
  6166.       FOR zy%=1 TO 4
  6167.         GOSUB zeileloeschen(z%-1)  !  4 ZEILEN, DA 4 GELÖSCHT WERDEN MÜSSEN
  6168.       NEXT zy%
  6169.       z%=z%-2
  6170.     ENDIF
  6171.   NEXT z%
  6172. RETURN
  6173. ' **********************************************************************
  6174. > PROCEDURE neuberechnung(abzeile%)
  6175.   LOCAL z%
  6176.   ' abzeile% muß derzeit immer 1 sein, da immer von Anfang an neuberechnet wird
  6177.   GOSUB freiezeilefinden(1,schlusszeile%)
  6178.   GOSUB altergebniszeileloeschen(schlusszeile%)
  6179.   GOSUB ueberzahlungszeileloeschen(schlusszeile%)
  6180.   GOSUB freiezeilefinden(1,schlusszeile%)
  6181.   FOR z%=abzeile% TO (schlusszeile%-1)
  6182.     IF fdgart#(z%)<20
  6183.       restbetrag#(z%)=betrag#(z%) ! Die Restbeträge werden=Anfangsbetrag gesetzt,
  6184.       ' da eine Neuberechnung erfolgt, nicht aber bei Restsummen u.ä.(>20)
  6185.     ENDIF
  6186.   NEXT z%
  6187.   FOR z%=abzeile% TO maximalbuchungen%
  6188.     EXIT IF fdgart#(z%)=0 ! Also keine Forderung
  6189.     SELECT fdgart#(z%)
  6190.     CASE 15 TO 16 !ALSO ZAHLUNG
  6191.       GOSUB summenbildung(z%-1,d1#,d2#,d3#,d4#)
  6192.       betrag#(z%-1)=d1#
  6193.       restbetrag#(z%-1)=d2#
  6194.       zinssatz#(z%-1)=d3#
  6195.       kzins#(z%-1)=d4#
  6196.       ' z%-1 ist die zeile, in die die Summe kommt
  6197.       ' Rückübergeben werden die Summen von: HPTFDG, KOSTEN, HF_ZINS, K-ZINS
  6198.       GOSUB verrechnung(z%,d1#,d2#,d3#,d4#,d5#)
  6199.       betrag#(z%+1)=d1#
  6200.       restbetrag#(z%+1)=d2#
  6201.       zinssatz#(z%+1)=d3#
  6202.       kzins#(z%+1)=d4#
  6203.       restbetrag#(z%)=d5#
  6204.       ' z% ist die Zahlungszeile
  6205.       ' Rückübergeben werden die Summen von:
  6206.       ' aufhf,aufkosten,aufhfzinsen,aufkostenzinsen,ueberzahlung)
  6207.       ' Restsummenbildung
  6208.       betrag#(z%+2)=betrag#(z%-1)-betrag#(z%+1)
  6209.       restbetrag#(z%+2)=restbetrag#(z%-1)-restbetrag#(z%+1)
  6210.       zinssatz#(z%+2)=zinssatz#(z%-1)-zinssatz#(z%+1)
  6211.       kzins#(z%+2)=kzins#(z%-1)-kzins#(z%+1)
  6212.       '
  6213.     CASE 1 TO 14 !ALSO AUSGABENPOSTEN (Hptfdg oder Kosten)
  6214.       zuvielzahlung#=0
  6215.       FOR y%=1 TO z%
  6216.         IF fdgart#(y%)=15 OR fdgart#(y%)=16 !ALSO ZAHLUNG
  6217.           IF restbetrag#(y%)>0 !ALSO ÜBERZAHLUNG
  6218.             ADD zuvielzahlung#,restbetrag#(y%) !SUMME DER ÜBERZAHLUNGEN
  6219.           ENDIF
  6220.         ENDIF
  6221.       NEXT y%
  6222.       IF zuvielzahlung#>0  ! ES LIEGEN ALSO ÜBERZAHLUNGEN VOR
  6223.         GOSUB zeileneinfuegen(z%+1,4) ! Z%+1, DA BEI Z% DIE AUSGABE STEHT
  6224.         ADD schlusszeile%,4 !weil 4 zeilen eingefügt wurden
  6225.         ' ES WERDEN 4 ZEILEN EINGEFÜGT AB Z%+1, IN Z% STEHT DIE AUSGABE
  6226.         ' ==> Z%+1=SUMME, Z%+2=ÜBERZAHLUNG, Z%+3=VERRECHNUNG,Z%+4=RESTSUMME
  6227.         betrag#(z%+2)=zuvielzahlung#
  6228.         fdgart#(z%+2)=23  ! FORDERUNGSART DER ÜBERZAHLUNGSVERRECHNUNGSZEILE
  6229.         '       PRINT "DATUM DER LETZTEN AUSGABE:";fdgdatum%(z%);"|"
  6230.         fdgdatum%(z%+2)=fdgdatum%(z%) !ALSO GLEICH DEM DATUM DER LETZTEN AUSGABE
  6231.         fdgart#(z%+1)=20
  6232.         fdgdatum%(z%+1)=fdgdatum%(z%)
  6233.         fdgart#(z%+3)=21
  6234.         fdgdatum%(z%+3)=fdgdatum%(z%)
  6235.         fdgart#(z%+4)=22
  6236.         fdgdatum%(z%+4)=fdgdatum%(z%)
  6237.         GOSUB summenbildung(z%+1,d1#,d2#,d3#,d4#)
  6238.         betrag#(z%+1)=d1#
  6239.         restbetrag#(z%+1)=d2#
  6240.         zinssatz#(z%+1)=d3#
  6241.         kzins#(z%+1)=d4#
  6242.         GOSUB verrechnung(z%+2,d1#,d2#,d3#,d4#,d5#)
  6243.         betrag#(z%+3)=d1#
  6244.         restbetrag#(z%+3)=d2#
  6245.         zinssatz#(z%+3)=d3#
  6246.         kzins#(z%+3)=d4#
  6247.         restbetrag#(z%+2)=d5#
  6248.         betrag#(z%+4)=betrag#(z%+1)-betrag#(z%+3)
  6249.         restbetrag#(z%+4)=restbetrag#(z%+1)-restbetrag#(z%+3)
  6250.         zinssatz#(z%+4)=zinssatz#(z%+1)-zinssatz#(z%+3)
  6251.         kzins#(z%+4)=kzins#(z%+1)-kzins#(z%+3)
  6252.         gesamtverrechnung#=betrag#(z%+3)+restbetrag#(z%+3)+zinssatz#(z%+3)+kzins#(z%+3)
  6253.         restverrechnung#=gesamtverrechnung#
  6254.         ' ABBUCHEN DER GESAMTVERRECHNUNG VON DEN BISHERIGEN ÜBERZAHLUNGEN
  6255.         FOR y%=1 TO z%
  6256.           IF fdgart#(y%)=15 OR fdgart#(y%)=16 !ALSOZAHLUNG
  6257.             IF restbetrag#(y%)>0 !ALSO ÜBERZAHLUNG
  6258.               IF restbetrag#(y%)<=restverrechnung# !ÜBERZAHLUNG<VERRECHNUNG
  6259.                 restverrechnung#=restverrechnung#-restbetrag#(y%)
  6260.                 restbetrag#(y%)=0
  6261.               ELSE
  6262.                 restbetrag#(y%)=restbetrag#(y%)-restverrechnung#
  6263.                 restverrechnung#=0
  6264.               ENDIF
  6265.             ENDIF
  6266.           ENDIF
  6267.         NEXT y%
  6268.         ADD z%,4
  6269.       ENDIF
  6270.     ENDSELECT
  6271.   NEXT z%
  6272.   ' Bildung der Endsummenzeile incl. Tageszinsen
  6273.   GOSUB freiezeilefinden(1,schlusszeile%)
  6274.   ' ++++++++++++++++++++++++++++++++++++++++
  6275.   fdgdatum%(schlusszeile%)=abrechnungsdatum%
  6276.   GOSUB summenbildung(schlusszeile%,endhfsumme#,endkostensumme#,endhfzinssumme#,endkostenzinssumme#)
  6277.   betrag#(schlusszeile%)=endhfsumme#
  6278.   restbetrag#(schlusszeile%)=endkostensumme#
  6279.   zinssatz#(schlusszeile%)=endhfzinssumme#
  6280.   fdgart#(schlusszeile%)=25  ! Forderungsartnr. der Endsummenzeile
  6281.   kzins#(schlusszeile%)=endkostenzinssumme#
  6282.   GOSUB tageszinsen(schlusszeile%,tageszinsen#)
  6283.   ' Gesamtsumme errechnen und sichern
  6284.   zinsdatum%(schlusszeile%)=INT(0.5+100*(betrag#(schlusszeile%)+restbetrag#(schlusszeile%)+zinssatz#(schlusszeile%)+kzins#(schlusszeile%)))
  6285.   gesamtsumme#=zinsdatum%(schlusszeile%)/100  ! /100 wg Integerfeld
  6286.   ueberzahlung#=0
  6287.   FOR z%=1 TO schlusszeile%-1
  6288.     SELECT fdgart#(z%)
  6289.     CASE 15 TO 16  ! ALSO ZAHLUNG
  6290.       ADD ueberzahlung#,restbetrag#(z%)
  6291.     ENDSELECT
  6292.     EXIT IF fdgart#(z%+1)=0
  6293.   NEXT z%
  6294.   GOSUB freiezeilefinden(1,freiezeile%)  ! Aktualisieren
  6295. RETURN
  6296. ' ***********************************************************************
  6297. > PROCEDURE tageszinsen(sz%,VAR tageszinsen#) ! SZ%=SCHLUSSZEILE
  6298.   ' tageszinsen werden zurückgegeben
  6299.   LOCAL i%
  6300.   i%=1  ! initialisierung
  6301.   tageszinsen#=0
  6302.   '
  6303.   ' aktuellen Diskontzins raussuchen
  6304.   DO
  6305.     EXIT IF diskont#(i%,1)=0  ! d.h. eine Zeile zu weit
  6306.     INC i%
  6307.   LOOP
  6308.   '
  6309.   FOR z%=1 TO sz%-1
  6310.     IF fdgart#(z%)<15  ! Also Kosten oder Hauptforderung
  6311.       IF zinssatz#(z%)<0  ! SCHECKZINS
  6312.         aktueller_diskontsatz#=diskont#(i%-1,2)
  6313.         ADD tageszinsen#,restbetrag#(z%)*(aktueller_diskontsatz#+ABS(zinssatz#(z%)))/36000
  6314.       ELSE  ! Bei null und anderen Zinssätzen
  6315.         ADD tageszinsen#,restbetrag#(z%)*zinssatz#(z%)/36000  ! Restfdg*Zinssatz IN %,
  6316.         ' bei null zinsen also null
  6317.         ' 36000 = 360 Zinstage/Jahr *100 %
  6318.       ENDIF
  6319.     ENDIF
  6320.   NEXT z%
  6321.   tageszinsen#=ROUND(tageszinsen#,2) ! Auf Pfennige runden
  6322. RETURN
  6323. ' ****************************************************************
  6324. > PROCEDURE scheckzinsen(ab_dat%,bis_dat%,betrag#,satzueberdiskont#,VAR zinsen#)
  6325.   ' satzueberdiskont muß positiv sein und ist der den Diskont übersteigende Zinssatz
  6326.   LOCAL i%
  6327.   zinsen#=0
  6328.   IF ab_dat%>=bis_dat%  ! DANN sowieso keine Zinsen
  6329.     GOTO scheckzinsen_ende
  6330.   ENDIF
  6331.   ' Das Feld diskont enthält das Datum(absolut) als (i%,1) und den Zinssatz in % (i%,2)
  6332.   ' Fälle: a) Keine Diskontänderung
  6333.   '        b) eine oder mehrere Diskontänderungen
  6334.   '
  6335.   ' ANFANGSZINSSATZ suchen
  6336.   i%=1
  6337.   DO
  6338.     EXIT IF diskont#(i%,1)<=ab_dat% AND diskont#(i%+1,1)>ab_dat%
  6339.     EXIT IF i%=199
  6340.     INC i%
  6341.   LOOP
  6342.   beginnzeile%=i%
  6343.   '
  6344.   ' AKTUELLEN ZINSSATZ SUCHEN
  6345.   i%=1
  6346.   DO
  6347.     EXIT IF diskont#(i%,1)=0  ! d.h. eine Zeile zu weit
  6348.     INC i%
  6349.   LOOP
  6350.   heutezeile%=i%-1
  6351.   '
  6352.   ' ZINSEN BERECHNEN
  6353.   IF ab_dat%<diskont#(beginnzeile%+1,1) AND bis_dat%<=diskont#(beginnzeile%+1,1)
  6354.     ' dann ein Zinssatz für den ganzen Zeitraum
  6355.     GOSUB zinstage(ab_dat%,bis_dat%,tage%)
  6356.     zinsen#=@round((satzueberdiskont#+diskont#(beginnzeile%,2))/36000*tage%*betrag#,2)  ! Auf Pfennige gerundet
  6357.   ELSE IF ab_dat%>=diskont#(heutezeile%,1)
  6358.     ' auch dann nur ein Zinssatz, nämlich der aktuelle
  6359.     GOSUB zinstage(ab_dat%,bis_dat%,tage%)
  6360.     zinsen#=@round((satzueberdiskont#+diskont#(heutezeile%,2))/36000*tage%*betrag#,2)  ! Auf Pfennige gerundet
  6361.   ELSE
  6362.     ' mehrere verschiedene Zinssätze
  6363.     ' 1. ZINSSATZ
  6364.     FOR i%=beginnzeile% TO heutezeile%
  6365.       EXIT IF diskont#(i%+1,1)=0  ! DANN LETZTER ZEITRAUM
  6366.       EXIT IF diskont#(i%,1)=>bis_dat%  ! DANN SCHONALLES BERECHNET
  6367.       zinszeitende%=MIN(bis_dat%,diskont#(i%+1,1)) ! das frühere ist maßgebend
  6368.       GOSUB datums_rueckumwandlung(zinszeitende%,t%,m%,j%)
  6369.       GOSUB datumsstring_erstellen(t%,m%,j%,1,d$)
  6370.       GOSUB datumsumwandlung(d$,end_dat%,dummy%)
  6371.       ' END_DAT IST JETZT TT.MM.JJ = ENDE DES 1. ZINSZEITRAUMS
  6372.       GOSUB zinstage(ab_dat%,end_dat%,tage%)
  6373.       ADD zinsen#,(satzueberdiskont#+diskont#(i%,2))/36000*tage%*betrag#  ! Auf Pfennige gerundet
  6374.       zinsen#=@round(zinsen#,2)
  6375.       ab_dat%=end_dat%  ! Aktualisieren für nächsten Zeitraum/Schleifendurchgang
  6376.     NEXT i%
  6377.     ' LETZTER ZEITRAUM
  6378.     IF diskont#(heutezeile%,1)<bis_dat%  ! DANN NOCH NICHT ALLES BERECHNET
  6379.       ' Bis abrechnungsdatum mit aktuellem Zinssatz falls noch nicht bis_dat% überschritten ist
  6380.       GOSUB zinstage(ab_dat%,bis_dat%,tage%)  ! früher : abrechnungsdatum$,tage%)
  6381.       ADD zinsen#,@round((satzueberdiskont#+diskont#(heutezeile%,2))/36000*tage%*betrag#,2)  ! Auf Pfennige gerundet
  6382.     ENDIF
  6383.   ENDIF
  6384. scheckzinsen_ende:
  6385. RETURN
  6386. ' *********************************************************
  6387. > FUNCTION round(wert#,stelle%)
  6388.   SELECT stelle%
  6389.   CASE 0
  6390.     wert#=INT(wert#+0.5)
  6391.   CASE 1
  6392.     wert#=INT(10*wert#+0.5)/10
  6393.   CASE 2
  6394.     wert#=INT(100*wert#+0.5)/100
  6395.   DEFAULT
  6396.     ~@rsc_alert(1,"Falscher Parameter|bei Procedure ROUND !"," [OK ",1)
  6397.   ENDSELECT
  6398.   RETURN wert#
  6399. ENDFUNC
  6400. ' **********************************************************************
  6401. '
  6402. ' EDITOREIGENSCHAFT DER BUCHUNGSEINGABEBOX
  6403. '
  6404. ' ******************************************************************
  6405. > PROCEDURE erste_buchungszeile_finden(VAR i%)
  6406.   GOSUB freiezeilefinden(1,freiezeile%)
  6407.   FOR i%=1 TO (freiezeile%-1)
  6408.     EXIT IF fdgart#(i%)<17  ! Also normale Buchungszeile
  6409.     EXIT IF fdgart#(i%)=0 ! Also nullte oder freie Zeile
  6410.   NEXT i%
  6411. RETURN
  6412. ' *********************************************************************
  6413. > PROCEDURE editorzeile_einsetzen(z%) ! z%= einzusetzende Zeile
  6414.   ' Knöpfe alle deselektieren
  6415.   FOR i%=hptfdg& TO zhlgdsch&
  6416.     IF @selected(buchungsbaum_adr%,i%)
  6417.       @select(buchungsbaum_adr%,i%,FALSE)  ! DESELEKTIEREN FDG-ART-BUTTON
  6418.       GOSUB objc_update(buchungsbaum_adr%,i%)
  6419.     ENDIF
  6420.   NEXT i%
  6421.   ' Voreinstellung der Forderungsart
  6422.   obj_nr%=MIN(hptfdg&+fdgart#(z%)-1,zhlgdsch&)
  6423.   @select(buchungsbaum_adr%,obj_nr%,TRUE)
  6424.   GOSUB objc_update(buchungsbaum_adr%,obj_nr%)
  6425.   IF fdgart#(z%)=14
  6426.     dummy$=SPACE$(INT((28-LEN(fdgname$(z%)))/2))+fdgname$(z%) ! Mittig einsetzen
  6427.     a$=SPACE$(28)
  6428.     LSET a$=dummy$
  6429.     CHAR{{OB_SPEC(buchungsbaum_adr%,fdgartpop&)}}=a$
  6430.     GOSUB objc_update(buchungsbaum_adr%,fdgartpop&)
  6431.   ENDIF
  6432.   ' Voreinstellung Betrag
  6433.   betrag$=STR$(betrag#(z%)*100,9)  ! wegen der Pfennige bzw Kommata
  6434.   CHAR{{OB_SPEC(buchungsbaum_adr%,betrag&)}}=betrag$
  6435.   GOSUB objc_update(buchungsbaum_adr%,betrag&)
  6436.   '
  6437.   ' Voreinstellung Zinssatz
  6438.   IF zinssatz#(z%)=0
  6439.     zinssatz$=""
  6440.   ELSE
  6441.     zinssatz$=STR$(ABS(zinssatz#(z%)*10000),6)  ! Wegen Länge des Editfeldes=6
  6442.   ENDIF
  6443.   CHAR{{OB_SPEC(buchungsbaum_adr%,zinssatz&)}}=zinssatz$
  6444.   IF zinssatz#(z%)<0
  6445.     ' Scheckbutton selektieren
  6446.     @select(buchungsbaum_adr%,bscheckz&,TRUE) ! selektieren
  6447.   ELSE  ! deselektieren
  6448.     @select(buchungsbaum_adr%,bscheckz&,FALSE)
  6449.   ENDIF
  6450.   GOSUB objc_update(buchungsbaum_adr%,zinssatz&)
  6451.   GOSUB objc_update(buchungsbaum_adr%,bscheckz&)
  6452.   '
  6453.   ' Voreinstellung Zinsdatum
  6454.   GOSUB undo_objc(buchungsbaum_adr%,zinsdat&,&H8) ! normale Darstellung
  6455.   GOSUB set_flag(buchungsbaum_adr%,zinsdat&,8) ! editierbar
  6456.   @select(buchungsbaum_adr%,bzinszust&,FALSE)  ! Zinsen ab Zustellung
  6457.   IF zinsdatum%(z%)=0
  6458.     zinsdatum$=""
  6459.   ELSE IF zinsdatum%(z%)>0
  6460.     GOSUB datums_rueckumwandlung(zinsdatum%(z%),t%,m%,j%)
  6461.     GOSUB datumsstring_erstellen(t%,m%,j%,1,zinsdatum$)
  6462.   ELSE IF zinsdatum%(z%)<0  ! ab Zustellung
  6463.     GOSUB do_objc(buchungsbaum_adr%,zinsdat&,&H8) ! helle Darstellung
  6464.     GOSUB del_flag(buchungsbaum_adr%,zinsdat&,8) !UNSELEKTIERBAR
  6465.     @select(buchungsbaum_adr%,bzinszust&,TRUE)  ! Zinsen ab Zustellung
  6466.     zinsdatum$=""
  6467.   ENDIF
  6468.   CHAR{{OB_SPEC(buchungsbaum_adr%,zinsdat&)}}=zinsdatum$
  6469.   GOSUB objc_update(buchungsbaum_adr%,zinsdat&)
  6470.   GOSUB objc_update(buchungsbaum_adr%,bzinszust&)
  6471.   '
  6472.   ' Voreinstellung Forderungsdatum
  6473.   IF fdgdatum%(z%)=0
  6474.     forderungsdatum$=""
  6475.   ELSE
  6476.     GOSUB datums_rueckumwandlung(fdgdatum%(z%),t%,m%,j%)
  6477.     GOSUB datumsstring_erstellen(t%,m%,j%,1,forderungsdatum$)
  6478.   ENDIF
  6479.   CHAR{{OB_SPEC(buchungsbaum_adr%,fdgdat&)}}=forderungsdatum$
  6480.   GOSUB objc_update(buchungsbaum_adr%,fdgdat&)
  6481. RETURN
  6482. ' *****************************************************
  6483. > PROCEDURE naechste_editorzeile(ed%,erste_buchgszeile%,fz%,schritt%)
  6484.   ' Übergabe von editorzeile(alte), freiezeile,schrittweite nötig
  6485.   ' keine Zahlungszeilen anzeigen
  6486.   IF schritt%=1 !vorwärts
  6487.     DO
  6488.       editorzeile%=MIN(editorzeile%+1,freiezeile%)
  6489.       EXIT IF fdgart#(editorzeile%)<17  ! Also normale Buchungszeile
  6490.       EXIT IF fdgart#(editorzeile%)=0 ! Also nullte oder freie Zeile
  6491.     LOOP
  6492.   ELSE IF schritt%=-1
  6493.     DO
  6494.       editorzeile%=MAX(editorzeile%-1,erste_buchgszeile%)
  6495.       EXIT IF fdgart#(editorzeile%)<17  ! Also normale Buchungszeile
  6496.       EXIT IF fdgart#(editorzeile%)=0 ! Also nullte oder freie Zeile
  6497.     LOOP
  6498.   ENDIF
  6499. RETURN
  6500. ' ********************************************************************
  6501. > PROCEDURE buchungsbox_initialisieren(redraw%)
  6502.   ' 0= ohne, 1= mit Redraw
  6503.   erstes_objekt%=betrag&
  6504.   ' Buchungs- Zeilennummer einsetzen
  6505.   GOSUB freiezeilefinden(1,freiezeile%)
  6506.   editorzeile%=freiezeile%
  6507.   editorzeile$=STR$(editorzeile%)
  6508.   CHAR{{OB_SPEC(buchungsbaum_adr%,zeilnr&)}}=editorzeile$
  6509.   @select(buchungsbaum_adr%,zeilnr&,TRUE)  ! Zeilennrbutton als Zeichen für Editmodus
  6510.   ' Knöpfe alle delektieren
  6511.   FOR i%=hptfdg& TO zhlgdsch&
  6512.     GOSUB is_objc(buchungsbaum_adr%,i%,1,*status%)
  6513.     IF status%=1
  6514.       @select(buchungsbaum_adr%,i%,FALSE)  ! DESELEKTIEREN FDG-ART-BUTTON
  6515.       knopfnr%=MIN(i%,zhlgdsch&)
  6516.       knopfnr%=MAX(i%,hptfdg&)
  6517.     ENDIF
  6518.   NEXT i%
  6519.   @select(buchungsbaum_adr%,hptfdg&,TRUE) ! Vorselektion Hptfdg-Button
  6520.   CHAR{{OB_SPEC(buchungsbaum_adr%,betrag&)}}=""
  6521.   @select(buchungsbaum_adr%,bscheckz&,FALSE) ! deselektieren
  6522.   CHAR{{OB_SPEC(buchungsbaum_adr%,zinssatz&)}}=""
  6523.   CHAR{{OB_SPEC(buchungsbaum_adr%,zinsdat&)}}=""
  6524.   CHAR{{OB_SPEC(buchungsbaum_adr%,fdgdat&)}}=""
  6525.   '
  6526.   GOSUB undo_objc(buchungsbaum_adr%,zinsdat&,&H8) ! normale Darstellung
  6527.   GOSUB set_flag(buchungsbaum_adr%,zinsdat&,8) ! editierbar
  6528.   @select(buchungsbaum_adr%,bzinszust&,FALSE)  ! Zinsen ab Zustellung
  6529.   ' NEUZEICHNEN / AKTUALISIEREN
  6530.   IF redraw%=1
  6531.     GOSUB objc_update(buchungsbaum_adr%,zeilnr&)
  6532.     GOSUB objc_update(buchungsbaum_adr%,knopfnr%)  ! nur der selektierte Knopf (Zeitkritisch)
  6533.     GOSUB objc_update(buchungsbaum_adr%,hptfdg&) ! Hptfdg neuzeichnen da aktualisiert
  6534.     GOSUB objc_update(buchungsbaum_adr%,betrag&)
  6535.     GOSUB objc_update(buchungsbaum_adr%,zinssatz&)
  6536.     GOSUB objc_update(buchungsbaum_adr%,bzinszust&)
  6537.     GOSUB objc_update(buchungsbaum_adr%,zinsdat&)
  6538.     GOSUB objc_update(buchungsbaum_adr%,fdgdat&)
  6539.     GOSUB objc_update(buchungsbaum_adr%,bscheckz&)
  6540.   ENDIF
  6541. RETURN
  6542. ' **************************************************************************
  6543. '
  6544. ' BILDSCHIRMDARSTELLUNG FÜR ABRECHNUNG NACH § 367
  6545. '
  6546. ' ************************************************************+
  6547. > PROCEDURE forderungstextfeld   ! früher: bildschirmaufstellung
  6548.   ERASE fdgtxt$()  ! Feldleeren
  6549.   ~FRE(0)  ! Garbage Collection
  6550.   DIM fdgtxt$(maximalbuchungen%+3)
  6551.   cols&=0
  6552.   lines&=0
  6553.   FOR j%=1 TO freiezeile%-1
  6554.     IF zinsdatum%(j%)>=0
  6555.       ' die folgende if Schleife dient nur zum Abfangen eines Fehlers der Vorversion
  6556.       IF zinsdatum%(j%)=0 AND zinssatz#(j%)>0 AND fdgart#(j%)<20
  6557.         ~@rsc_alert(1,"Unsinniges Zinsdatum|in Zeile "+STR$(j%)+"!|Bitte korrigieren."," [OK ",1)
  6558.       ENDIF
  6559.       GOSUB datums_rueckumwandlung(zinsdatum%(j%),t%,m%,y%)
  6560.       GOSUB datumsstring_erstellen(t%,m%,y%,2,zinsdatum$)
  6561.       IF zinsdatum%(j%)=0
  6562.       ENDIF
  6563.     ELSE IF zinsdatum%(j%)=-1
  6564.       zinsdatum$="Zustellung"
  6565.     ELSE IF zinsdatum%(j%)=-2
  6566.       zinsdatum$="VB-Erlaß"
  6567.     ENDIF
  6568.     GOSUB datums_rueckumwandlung(fdgdatum%(j%),t%,m%,y%)
  6569.     GOSUB datumsstring_erstellen(t%,m%,y%,2,forderungsdatum$)
  6570.     SELECT fdgart#(j%) ! FORDERUNGSART
  6571.     CASE 1 ! HAUPTFORDERUNG
  6572.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+@dez_komma$(betrag#(j%),11,2,FALSE)+SPACE$(29)+"HF "
  6573.       IF zinssatz#(j%)<0
  6574.         fdgtxt$(j%)=fdgtxt$(j%)+@dez_komma$(ABS(zinssatz#(j%)),0,0,FALSE)+" % über Diskont ab "+zinsdatum$
  6575.       ELSE IF zinssatz#(j%)>0
  6576.         fdgtxt$(j%)=fdgtxt$(j%)+@dez_komma$(zinssatz#(j%),0,0,FALSE)+" % ab "+zinsdatum$
  6577.       ENDIF
  6578.     CASE 2 TO 13  ! KOSTEN,aber nicht popup-Kosten
  6579.     kostennamen:
  6580.       DATA KFB ,MB ,VB ,ZVA ,PFÜB ,EV-Antrag ,Nachnahme ,EMA ,Postanfrage ,HR-Anfrage ,Gewerbeanfrage ,Auslagen ,Nebenfdg. ,
  6581.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+SPACE$(10)+@dez_komma$(betrag#(j%),11,2,FALSE)
  6582.       RESTORE kostennamen
  6583.       FOR i%=2 TO fdgart#(j%)
  6584.         READ kostenname$
  6585.       NEXT i%
  6586.       fdgtxt$(j%)=fdgtxt$(j%)+SPACE$(19)+kostenname$
  6587.       IF zinssatz#(j%)<0
  6588.         fdgtxt$(j%)=fdgtxt$(j%)+@dez_komma$(ABS(zinssatz#(j%)),0,0,FALSE)+" % über Diskont ab "+zinsdatum$
  6589.       ELSE IF zinssatz#(j%)>0
  6590.         fdgtxt$(j%)=fdgtxt$(j%)+@dez_komma$(zinssatz#(j%),0,0,FALSE)+" % ab "+zinsdatum$
  6591.       ENDIF
  6592.     CASE 14  ! POPUP-KOSTENARTEN
  6593.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+SPACE$(10)+@dez_komma$(betrag#(j%),11,2,FALSE)
  6594.       fdgtxt$(j%)=fdgtxt$(j%)+SPACE$(19)+fdgname$(j%)
  6595.       IF zinssatz#(j%)<0
  6596.         fdgtxt$(j%)=fdgtxt$(j%)+@dez_komma$(ABS(zinssatz#(j%)),0,0,FALSE)+" % über Diskont ab "+zinsdatum$
  6597.       ELSE IF zinssatz#(j%)>0
  6598.         fdgtxt$(j%)=fdgtxt$(j%)+@dez_komma$(zinssatz#(j%),0,0,FALSE)+" % ab "+zinsdatum$
  6599.       ENDIF
  6600.     CASE 15 TO 16  ! ZAHLUNGEN
  6601.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+@dez_komma$(betrag#(j%),11,2,FALSE)+SPACE$(29)+"Zahlung"
  6602.     CASE 20
  6603.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+@dez_komma$(betrag#(j%),11,2,FALSE)+@dez_komma$(restbetrag#(j%),10,2,FALSE)+@dez_komma$(zinssatz#(j%),10,2,FALSE)+@dez_komma$(kzins#(j%),8,2,FALSE)+" Summen"
  6604.     CASE 21
  6605.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+@dez_komma$(betrag#(j%),11,2,FALSE)+@dez_komma$(restbetrag#(j%),10,2,FALSE)+@dez_komma$(zinssatz#(j%),10,2,FALSE)+@dez_komma$(kzins#(j%),8,2,FALSE)+" verrechnet"
  6606.     CASE 22
  6607.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+@dez_komma$(betrag#(j%),11,2,FALSE)+@dez_komma$(restbetrag#(j%),10,2,FALSE)+@dez_komma$(zinssatz#(j%),10,2,FALSE)+@dez_komma$(kzins#(j%),8,2,FALSE)+" Restsummen"
  6608.     CASE 23
  6609.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+@dez_komma$(betrag#(j%),11,2,FALSE)+SPACE$(29)+"Guthaben bisher"
  6610.     CASE 25
  6611.       fdgtxt$(j%)=STR$(j%,3,0)+". "+forderungsdatum$+@dez_komma$(betrag#(j%),11,2,FALSE)+@dez_komma$(restbetrag#(j%),10,2,FALSE)+@dez_komma$(zinssatz#(j%),10,2,FALSE)+@dez_komma$(kzins#(j%),8,2,FALSE)+" Endsumme"
  6612.       fdgtxt$(j%+1)=""
  6613.       fdgtxt$(j%+2)="Gesamtforderung am "+forderungsdatum$+": DM "+@dez_komma$(zinsdatum%(j%)/100,0,2,TRUE)+" zzgl. DM "+@dez_komma$(tageszinsen#,0,2,TRUE)+" weitere Zinsen/Tag"
  6614.       cols&=MAX(cols&,LEN(fdgtxt$(j%+2)))! maximal vorkommende Spaltenzahl
  6615.       IF ueberzahlung#>0
  6616.         fdgtxt$(j%+3)="Überzahlung DM "+@dez_komma$(ueberzahlung#,0,2,FALSE)+" wird auf Antrag rückerstattet."
  6617.       ENDIF
  6618.     ENDSELECT
  6619.     cols&=MAX(cols&,LEN(fdgtxt$(j%)))! maximal vorkommende Spaltenzahl
  6620.   NEXT j%
  6621.   lines&=j%+2  ! Gesamtzeilenzahl
  6622.   ~WIND_GET(0,4,dummy%,dummy%,w%,h%)  ! Desktopmaße
  6623.   cols&=MAX(INT(w%/charw&)-3,cols&)   ! Damit volle Fenstergröße möglich ist
  6624.   lines&=MAX(INT(h%/charh&)-3,lines&) ! Damit volle Fenstergröße möglich ist
  6625.   @change_wind(0,charw&*cols&,charh&*lines&,-1,-1,-1,-1,-1)
  6626.   redraw_part(0,0)  ! für Fensternr 0=fdgberechnungsfenster
  6627. RETURN
  6628. ' ****************************************************************
  6629. '
  6630. ' EINGABEN ZUM FALL
  6631. '
  6632. ' *********************************************************************
  6633. > PROCEDURE falleingaben
  6634.   LOCAL ex_obj%,erstes_objekt%  ! Da andere Dialoge aus diesem heraus aufgerufen werden können
  6635.   IF abbruch%=TRUE
  6636.     GOTO falleingaben_ende
  6637.   ENDIF
  6638.   falldatenbaum_adr%=rsc_adr%(falldatenbaum&)
  6639.   @dialog_positionieren(falldatenbaum&)
  6640.   ' +++++++++++++++++++
  6641.   ' GLÄUBIGERDATEN
  6642.   '
  6643.   ' Voreinstellung GLÄUBIGERANREDEFELD (aus alter Version 1+2 zusammengesetzt)
  6644.   ' Vorsicht bei zu langer Anrede >>> Absturz möglich
  6645.   CHAR{{OB_SPEC(falldatenbaum_adr%,glname&)}}=TRIM$(glaeubigeranrede1$+" "+glaeubigeranrede2$)
  6646.   ' +++++++++
  6647.   ' Voreinstellung GLÄUBIGERSTRASSE
  6648.   CHAR{{OB_SPEC(falldatenbaum_adr%,glstr&)}}=glaeubigerstrasse$
  6649.   ' +++++++++
  6650.   ' Voreinstellung GLÄUBIGERORT
  6651.   CHAR{{OB_SPEC(falldatenbaum_adr%,glort&)}}=glaeubigerort$
  6652.   ' +++++++++
  6653.   ' Voreinstellung GLÄUBIGERGF (Aus alter Version GF1+ GF2)
  6654.   ' Vorsicht bei zu langer Anrede >>> Absturz möglich
  6655.   CHAR{{OB_SPEC(falldatenbaum_adr%,glgf&)}}=TRIM$(glaeubigergf1$+" "+glaeubigergf2$)
  6656.   ' +++++++++++++++++++
  6657.   '
  6658.   ' SCHULDNERDATEN
  6659.   '
  6660.   ' Voreinstellung SCHULDNERANREDEFELD (aus alter Version 1+2 zusammengesetzt)
  6661.   ' Vorsicht bei zu langer Anrede >>> Absturz möglich
  6662.   CHAR{{OB_SPEC(falldatenbaum_adr%,schname&)}}=TRIM$(schuldneranrede1$+" "+schuldneranrede2$)
  6663.   ' +++++++++
  6664.   ' Voreinstellung SCHULDNERSTRASSE
  6665.   CHAR{{OB_SPEC(falldatenbaum_adr%,schstr&)}}=schuldnerstrasse$
  6666.   ' +++++++++
  6667.   ' Voreinstellung SCHULDNERORT
  6668.   CHAR{{OB_SPEC(falldatenbaum_adr%,schort&)}}=schuldnerort$
  6669.   ' +++++++++
  6670.   ' Voreinstellung SCHULDNERGF (Aus alter Version GF1+ GF2)
  6671.   ' Vorsicht bei zu langer Anrede >>> Absturz möglich
  6672.   CHAR{{OB_SPEC(falldatenbaum_adr%,schgf&)}}=TRIM$(schuldnergf1$+" "+schuldnergf2$)
  6673.   ' +++++++++++++++++++++++
  6674.   '
  6675.   ' TITELDATEN
  6676.   IF titelart$=""   ! Voreinstellung
  6677.     titelart$="Vollstreckungsbescheid"
  6678.   ENDIF
  6679.   ' Auffüllen auf 30 Zeichen
  6680.   dummy%=LEN(titelart$)
  6681.   a%=INT((30-dummy%)/2)
  6682.   titelart$=SPACE$(a%)+titelart$+SPACE$(30-a%-dummy%)
  6683.   CHAR{{OB_SPEC(falldatenbaum_adr%,titelpop&)}}=titelart$
  6684.   '
  6685.   ' VOREINSTELLUNG TITELGERICHT
  6686.   IF titelgericht$<>""
  6687.     a$=titelgericht$
  6688.   ELSE
  6689.     a$="Amtsgerichts"
  6690.   ENDIF
  6691.   CHAR{{OB_SPEC(falldatenbaum_adr%,gericht&)}}=a$
  6692.   '
  6693.   IF titelort$<>""
  6694.     a$=titelort$
  6695.   ELSE
  6696.     a$=standardadressatort$
  6697.   ENDIF
  6698.   CHAR{{OB_SPEC(falldatenbaum_adr%,gerort&)}}=a$
  6699.   '
  6700.   CHAR{{OB_SPEC(falldatenbaum_adr%,datumtit&)}}=titeldatum$
  6701.   CHAR{{OB_SPEC(falldatenbaum_adr%,azgerich&)}}=titelaz$
  6702.   ' ++++++++
  6703.   ' Vorbereitung des Dialogs
  6704.   rsc_draw(falldatenbaum&,fensterdial%)
  6705.   erstes_objekt%=glname&
  6706. neutiteldatum:
  6707.   '
  6708.   ex_obj%=@rsc_do(falldatenbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  6709.   SELECT ex_obj%
  6710.   CASE titelpop&,artpop&,titelcircle&
  6711.     erstes_objekt%=gericht&
  6712.     GOTO neutiteldatum
  6713.   CASE gldb&
  6714.     ' Prüfen, ob kürzel angegeben ist ($.....), ggf extrahieren + DB aufrufen
  6715.     suchstring$=CHAR{{OB_SPEC(falldatenbaum_adr%,glname&)}}
  6716.     IF INSTR(suchstring$,"$")>0  ! dann kürzel angegeben
  6717.       kuerzel$=MID$(suchstring$,INSTR(suchstring$,"$")+1)
  6718.       suchstring$=""
  6719.     ELSE
  6720.       kuerzel$=""
  6721.     ENDIF
  6722.     ' Parameter: Kürzel,suchstring,aufrufender Baum,Objekt,Adressenart
  6723.     @daten_zum_fall(kuerzel$,suchstring$,falldatenbaum&,glname&,1)
  6724.     objc_update(falldatenbaum_adr%,glname&)
  6725.     objc_update(falldatenbaum_adr%,glstr&)
  6726.     objc_update(falldatenbaum_adr%,glort&)
  6727.     objc_update(falldatenbaum_adr%,glgf&)
  6728.     @select(falldatenbaum_adr%,gldb&,FALSE)
  6729.     @objc_update(falldatenbaum_adr%,gldb&)
  6730.     erstes_objekt%=glname&
  6731.     GOTO neutiteldatum
  6732.   CASE schdb&
  6733.     ' Prüfen, ob kürzel angegeben ist ($.....), ggf extrahieren + DB aufrufen
  6734.     suchstring$=CHAR{{OB_SPEC(falldatenbaum_adr%,schname&)}}
  6735.     IF INSTR(suchstring$,"$")>0  ! dann kürzel angegeben
  6736.       kuerzel$=MID$(suchstring$,INSTR(suchstring$,"$")+1)
  6737.       suchstring$=""
  6738.     ELSE
  6739.       kuerzel$=""
  6740.     ENDIF
  6741.     ' Parameter: Kürzel,suchstring,aufrufender Baum,Objekt,Adressenart
  6742.     @daten_zum_fall(kuerzel$,suchstring$,falldatenbaum&,schname&,1)
  6743.     objc_update(falldatenbaum_adr%,schname&)
  6744.     objc_update(falldatenbaum_adr%,schstr&)
  6745.     objc_update(falldatenbaum_adr%,schort&)
  6746.     objc_update(falldatenbaum_adr%,schgf&)
  6747.     @select(falldatenbaum_adr%,schdb&,FALSE)
  6748.     @objc_update(falldatenbaum_adr%,schdb&)
  6749.     erstes_objekt%=schname&
  6750.     GOTO neutiteldatum
  6751.   CASE abbruch5&
  6752.     abbruch%=TRUE
  6753.   CASE fertig5&
  6754.     ' TITELDATEN AUSLESEN
  6755.     titelgericht$=CHAR{{OB_SPEC(falldatenbaum_adr%,gericht&)}}
  6756.     titelort$=CHAR{{OB_SPEC(falldatenbaum_adr%,gerort&)}}
  6757.     titeldatum$=CHAR{{OB_SPEC(falldatenbaum_adr%,datumtit&)}}
  6758.     GOSUB datumsumwandlung(titeldatum$,tdatum%,kontrolle%)
  6759.     titelaz$=CHAR{{OB_SPEC(falldatenbaum_adr%,azgerich&)}}
  6760.     '
  6761.     ' +++++++++
  6762.     ' GLÄUBIGERDATEN AUSLESEN
  6763.     glaeubigeranrede1$=CHAR{{OB_SPEC(falldatenbaum_adr%,glname&)}}
  6764.     glaeubigeranrede2$=""  ! NACH ERSTER ANWAHL IST ANREDE 2 LEERSTRING
  6765.     glaeubigerstrasse$=CHAR{{OB_SPEC(falldatenbaum_adr%,glstr&)}}
  6766.     glaeubigerort$=CHAR{{OB_SPEC(falldatenbaum_adr%,glort&)}}
  6767.     glaeubigergf1$=CHAR{{OB_SPEC(falldatenbaum_adr%,glgf&)}}
  6768.     glaeubigergf2$=""  ! NACH ERSTER ANWAHL IST GLGF2$ LEERSTRING
  6769.     '
  6770.     ' ++++++++++++++++++++
  6771.     ' SCHULDNERDATEN AUSLESEN
  6772.     schuldneranrede1$=CHAR{{OB_SPEC(falldatenbaum_adr%,schname&)}}
  6773.     schuldneranrede2$=""  ! NACH ERSTER ANWAHL IST ANREDE 2 LEERSTRING
  6774.     schuldnerstrasse$=CHAR{{OB_SPEC(falldatenbaum_adr%,schstr&)}}
  6775.     schuldnerort$=CHAR{{OB_SPEC(falldatenbaum_adr%,schort&)}}
  6776.     schuldnergf1$=CHAR{{OB_SPEC(falldatenbaum_adr%,schgf&)}}
  6777.     schuldnergf2$=""  ! NACH ERSTER ANWAHL IST GLGF2$ LEERSTRING
  6778.     ' ++++++++++++++++++++
  6779.     ' +++++
  6780.     ' Feststellen der Titelart (von Urteil bis Rechnung), Sortierung vorausgesetzt
  6781.     titelart$=TRIM$(CHAR{{OB_SPEC(falldatenbaum_adr%,titelpop&)}})  ! ohne Leerzeichen
  6782.   ENDSELECT
  6783.   ' Beenden des Dialogs
  6784.   rsc_back(falldatenbaum&)
  6785.   @select(falldatenbaum_adr%,ex_obj%,FALSE)
  6786.   ' Dialog beendet
  6787. falleingaben_ende:
  6788. RETURN
  6789. ' ************************************************************************+
  6790. > PROCEDURE az(aktenzeichenvoreinstellungs$)
  6791.   ' ABRECHNUNGSDATUM ABFRAGEN (per Datum XX.XX.XX)
  6792.   azbaum_adr%=rsc_adr%(azbaum&)
  6793.   '  ~@xrsrc_gaddr(0,azbaum&,azbaum_adr%)
  6794.   @dialog_positionieren(azbaum&)
  6795.   '
  6796.   ' Vorbelegung der Felder
  6797.   tagesdatum$=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  6798.   CHAR{{OB_SPEC(azbaum_adr%,perdatum&)}}=tagesdatum$
  6799.   CHAR{{OB_SPEC(azbaum_adr%,az&)}}=aktenzeichenvoreinstellungs$
  6800.   '
  6801.   ' Vorbereitung des Dialogs
  6802.   @rsc_draw(azbaum&,fensterdial%)
  6803.   erstes_objekt%=az&
  6804. nochmalperdatum:
  6805.   ex_obj%=@rsc_do(azbaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  6806.   IF ex_obj%=abbruc18&
  6807.     ' Bei Abbruch das Abrechnungsdatum immer auf heute setzen
  6808.     datum$=LEFT$(DATE$,2)+MID$(DATE$,4,2)+RIGHT$(DATE$,2)
  6809.     GOSUB datumsumwandlung(datum$,abrechnungsdatum%,kontrolle%)
  6810.     abbruch%=TRUE  ! Globale Variable um zum Menu zurückzukehren
  6811.   ELSE  ! Also OK angeklickt
  6812.     az$=CHAR{{OB_SPEC(azbaum_adr%,az&)}}
  6813.     perdatum$=CHAR{{OB_SPEC(azbaum_adr%,perdatum&)}}
  6814.     GOSUB datumsumwandlung(perdatum$,abrechnungsdatum%,kontrolle%)
  6815.     IF kontrolle%=1
  6816.       @select(azbaum_adr%,ex_obj%,FALSE)
  6817.       GOSUB objc_update(azbaum_adr%,ex_obj%)
  6818.       dummy%=@rsc_alert(1,"Unzulässiges Datum !"," [OK ",1)
  6819.       erstes_objekt%=perdatum&
  6820.       GOTO nochmalperdatum
  6821.     ENDIF
  6822.   ENDIF
  6823.   CHAR{titles%}=" "+az$+" "
  6824.   @set_wind_line(0,2,titles%)  ! Entspricht titlewindow
  6825.   '
  6826.   ' Beenden des Dialogs
  6827.   @rsc_back(azbaum&)
  6828.   @select(azbaum_adr%,ex_obj%,FALSE)
  6829.   ' Dialog beendet
  6830. RETURN
  6831. ' ************************************************************
  6832. > PROCEDURE adressateingabe
  6833.   adressbaum_adr%=rsc_adr%(adressbaum&)
  6834.   @dialog_positionieren(adressbaum&)
  6835.   ' +++++++++  VORBELEGUNG der ADRESSFELDER +++++++++++
  6836.   SELECT wasdrucken%
  6837.   CASE 1,11,12,28  ! § 367, ZV-Androhung,Ratenvergleich, Musterbibliothek
  6838.     adressat$="             ADRESSAT             "
  6839.     GOSUB set_string(adressbaum_adr%,wessadr&,adressat$)
  6840.     ' Voreinstellung ADRESSATANREDEFELD 1+2, Str. und Ort (GFs unberücksichtigt)
  6841.     IF vollstreckungsgerichtanrede1$<>""  ! Schon einmal jemand eingegeben
  6842.       CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}=schuldneranrede1$
  6843.       CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=schuldneranrede2$
  6844.       CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}=schuldnerstrasse$
  6845.       CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=schuldnerort$
  6846.     ELSE
  6847.       CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}=""  ! falls nicht definiert, AG
  6848.       CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=""  ! falls nicht definiert, Vollstreckungsgericht
  6849.       CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}=""
  6850.       CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=""
  6851.     ENDIF
  6852.   CASE 2 TO 7,13,14  ! incl Zahlungsverbot
  6853.     GOSUB set_string(adressbaum_adr%,wessadr&,"  ANSCHRIFT VOLLSTRECKUNGSGERICHT ")
  6854.     ' Voreinstellung ADRESSATANREDEFELD 1+2, Str. und Ort (GFs unberücksichtigt)
  6855.     IF vollstreckungsgerichtanrede1$<>""  ! Bereits einmal was eingegeben
  6856.       CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}=vollstreckungsgerichtanrede1$
  6857.       CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=vollstreckungsgerichtanrede2$
  6858.       CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}=vollstreckungsgerichtstrasse$
  6859.       CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=vollstreckungsgerichtort$
  6860.     ELSE IF standardadressatanrede1$<>""  ! sonst Standardadressat
  6861.       CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}=standardadressatanrede1$
  6862.       CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=standardadressatanrede2$
  6863.       CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}=standardadressatstrasse$
  6864.       CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=standardadressatort$
  6865.     ELSE
  6866.       CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}="Amtsgericht"  ! falls nicht definiert, AG
  6867.       dummy$=SPACE$(45)
  6868.       LSET dummy$="- Vollstreckungsgericht -"
  6869.       CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=dummy$
  6870.       CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}=""
  6871.       CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=""
  6872.     ENDIF
  6873.   CASE 8  ! ANMAHNUNG DER DRITTSCHULDNERAUSKUNFT
  6874.     GOSUB set_string(adressbaum_adr%,wessadr&,"     ANSCHRIFT DRITTSCHULDNER     ")
  6875.     CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}=drittschuldneranrede1$
  6876.     CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=drittschuldneranrede2$
  6877.     CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}=drittschuldnerstrasse$
  6878.     CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=drittschuldnerort$
  6879.   CASE 9  ! POSTANFRAGE
  6880.     GOSUB set_string(adressbaum_adr%,wessadr&,"        ANSCHRIFT POSTAMT         ")
  6881.     CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}="Postamt"
  6882.     dummy$=SPACE$(45)
  6883.     LSET dummy$="- Anschriftenprüfungen -"
  6884.     CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=dummy$
  6885.     CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}="Postfach"
  6886.     CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=schuldnerort$
  6887.   CASE 10  ! EINWOHNERMELDEAMTSANFRAGE
  6888.     GOSUB set_string(adressbaum_adr%,wessadr&,"      ANSCHRIFT MELDEBEHÖRDE      ")
  6889.     GOSUB set_string(adressbaum_adr%,wessadr&,adressat$)
  6890.     CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}="Gemeindeverwaltung"
  6891.     dummy$=SPACE$(45)
  6892.     LSET dummy$="- Meldebehörde -"
  6893.     CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=dummy$
  6894.     CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}="Postfach"
  6895.     CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=schuldnerort$
  6896.   ENDSELECT
  6897.   ' +++++++++
  6898.   GOSUB do_objc(adressbaum_adr%,gf1&,&H8) ! helle Darstellung "GF1"
  6899.   GOSUB do_objc(adressbaum_adr%,gf2&,&H8) ! helle Darstellung "GF2"
  6900.   GOSUB del_flag(adressbaum_adr%,gf1&,8) !UNSELEKTIERBAR
  6901.   GOSUB del_flag(adressbaum_adr%,gf2&,8) !UNSELEKTIERBAR
  6902.   ' +++++++++++
  6903.   ' Vorbereitung des Dialogs
  6904.   rsc_draw(adressbaum&,fensterdial%)
  6905.   '
  6906.   ' Duchführen des Dialogs
  6907. neuadresse:
  6908.   ex_obj%=@rsc_do(adressbaum&,anrede1&,dummy&)  ! dummy, da kein Popupmenu in der Box
  6909.   '
  6910.   SELECT ex_obj%
  6911.   CASE anrede2&,anrede2button&,anrede2cycle&
  6912.     GOTO neuadresse
  6913.   CASE adressdb&
  6914.     ' Prüfen, ob kürzel angegeben ist ($.....), ggf extrahieren + DB aufrufen
  6915.     suchstring$=CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}
  6916.     IF INSTR(suchstring$,"$")>0  ! dann kürzel angegeben
  6917.       kuerzel$=MID$(suchstring$,INSTR(suchstring$,"$")+1)
  6918.       suchstring$=""
  6919.     ELSE
  6920.       kuerzel$=""
  6921.     ENDIF
  6922.     ' Parameter: Kürzel,suchstring,aufrufender Baum,Objekt,Adressenart
  6923.     @daten_zum_fall(kuerzel$,suchstring$,adressbaum&,anrede1&,2)  ! 2= AmtsGerichte
  6924.     objc_update(adressbaum_adr%,anrede1&)
  6925.     objc_update(adressbaum_adr%,anrede2&)
  6926.     objc_update(adressbaum_adr%,strasse&)
  6927.     objc_update(adressbaum_adr%,ort&)
  6928.     objc_update(adressbaum_adr%,gf1&)
  6929.     @select(adressbaum_adr%,adressdb&,FALSE)
  6930.     @objc_update(adressbaum_adr%,adressdb&)
  6931.     GOTO neuadresse
  6932.   CASE abbruch8&
  6933.     druckabbruch%=TRUE
  6934.   ENDSELECT
  6935.   @select(adressbaum_adr%,ex_obj%,FALSE)
  6936.   GOSUB undo_objc(adressbaum_adr%,gf1&,&H8) ! schwarze Darstellung "GF1"
  6937.   GOSUB undo_objc(adressbaum_adr%,gf2&,&H8) ! schwarze Darstellung "GF2"
  6938.   GOSUB set_flag(adressbaum_adr%,gf1&,8) ! SELEKTIERBAR
  6939.   GOSUB set_flag(adressbaum_adr%,gf2&,8) ! SELEKTIERBAR
  6940.   ' AUSLESEN DER DIALOGTEXTE
  6941.   adressatanrede1$=CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}
  6942.   adressatanrede2$=TRIM$(CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}})
  6943.   adressatstrasse$=CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}
  6944.   adressatort$=CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}
  6945.   adressatgf1$=CHAR{{OB_SPEC(adressbaum_adr%,gf1&)}}
  6946.   adressatgf2$=CHAR{{OB_SPEC(adressbaum_adr%,gf2&)}}
  6947.   '
  6948.   ' FALLS VOLLSTRECKUNGSGERICHT EINGEGEBEN WURDE, DIE STRINGS AKTUALISIEREN
  6949.   SELECT wasdrucken%
  6950.   CASE 2 TO 7,13,14  ! NUR DA IST DAS VOLLSTRECKUNGSGERICHT ADRESSAT
  6951.     ' bei 367 Abrechnung nicht, da sonst aus versehen an Schuldner verschickt wird
  6952.     vollstreckungsgerichtanrede1$=adressatanrede1$
  6953.     vollstreckungsgerichtanrede2$=adressatanrede2$
  6954.     vollstreckungsgerichtstrasse$=adressatstrasse$
  6955.     vollstreckungsgerichtort$=adressatort$
  6956.   CASE 8  ! Anmahnung der Drittschuldnerauskunft
  6957.     drittschuldneranrede1$=adressatanrede1$
  6958.     drittschuldneranrede2$=adressatanrede2$
  6959.     drittschuldnerstrasse$=adressatstrasse$
  6960.     drittschuldnerort$=adressatort$
  6961.   ENDSELECT
  6962.   ' Beenden des Dialogs
  6963.   @rsc_back(adressbaum&)
  6964.   @select(adressbaum_adr%,ex_obj%,FALSE)
  6965.   ' Dialog beendet
  6966. RETURN
  6967. ' *****************************************************************
  6968. > PROCEDURE nachtexteingaben
  6969.   SELECT wasdrucken%
  6970.   CASE 3,7
  6971.     ' Pfueb/Zahlungsverbot ==> Eingaben zu Drittschuldner und Anspruch
  6972.     ' WEITER UNTERSCHEIDEN NACH ANSPRUCH==> VERSCH NACHTEXTE
  6973.     ' NACHTEXTE HEISSEN WIE FOLGT:
  6974.     ' NACHTXT_PFUEB_AA$=ARBEITSAMT
  6975.     ' NACHTXT_PFUEB_AG$=ARBEITGEBER
  6976.     ' NACHTXT_PFUEB_BK$=BANK
  6977.     ' NACHTXT_PFUEB_FA$=FINANZAMT
  6978.     ' NACHTXT_PFUEB_LV$=LEBENSVERSICHERUNG
  6979.     ' NACHTXT_PFUEB_RT$=RENTENVERSICHERUNG
  6980.     ' NACHTXT_PFUEB_ANDERES$=ANDERES
  6981.     ' NACHTXT_PFUEB_WK$=WERKLOHN
  6982.     ' NACHTXT_PFUEB_GELADEN$=GELADENER NACHTEXT
  6983.     ' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  6984.     '
  6985.     adressbaum_adr%=rsc_adr%(adressbaum&)
  6986.     @dialog_positionieren(adressbaum&)
  6987.     '
  6988.     ' +++++++++  VORBELEGUNG der ADRESSFELDER +++++++++++
  6989.     GOSUB set_string(adressbaum_adr%,wessadr&,"     ANSCHRIFT DRITTSCHULDNER     ")
  6990.     erstes_objekt%=anrede1&
  6991.     '
  6992.     ' BOX VORBELEGEN
  6993.     CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}=drittschuldneranrede1$
  6994.     CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}=drittschuldneranrede2$
  6995.     CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}=drittschuldnerstrasse$
  6996.     CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}=drittschuldnerort$
  6997.     CHAR{{OB_SPEC(adressbaum_adr%,gf1&)}}=drittschuldnergf1$
  6998.     CHAR{{OB_SPEC(adressbaum_adr%,gf2&)}}=drittschuldnergf2$
  6999.     '
  7000.     ' BOX ZEICHNEN
  7001.     rsc_draw(adressbaum&,fensterdial%)
  7002.     ' Duchführen des Dialogs
  7003.   nochmal_adresseingabe:
  7004.     ex_obj%=@rsc_do(adressbaum&,anrede1&,dummy&)  ! dummy, da kein Popupmenu in der Box
  7005.     SELECT ex_obj%
  7006.     CASE anrede2&,anrede2cycle&,anrede2button&
  7007.       GOTO nochmal_adresseingabe
  7008.     CASE adressdb&
  7009.       ' Prüfen, ob kürzel angegeben ist ($.....), ggf extrahieren + DB aufrufen
  7010.       suchstring$=CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}
  7011.       IF INSTR(suchstring$,"$")>0  ! dann kürzel angegeben
  7012.         kuerzel$=MID$(suchstring$,INSTR(suchstring$,"$")+1)
  7013.         suchstring$=""
  7014.       ELSE
  7015.         kuerzel$=""
  7016.       ENDIF
  7017.       ' Parameter: Kürzel,suchstring,aufrufender Baum,Objekt,Adressenart
  7018.       @daten_zum_fall(kuerzel$,suchstring$,adressbaum&,anrede1&,2)  ! 2= AmtsGerichte
  7019.       objc_update(adressbaum_adr%,anrede1&)
  7020.       objc_update(adressbaum_adr%,anrede2&)
  7021.       objc_update(adressbaum_adr%,strasse&)
  7022.       objc_update(adressbaum_adr%,ort&)
  7023.       objc_update(adressbaum_adr%,gf1&)
  7024.       @select(adressbaum_adr%,adressdb&,FALSE)
  7025.       @objc_update(adressbaum_adr%,adressdb&)
  7026.       GOTO nochmal_adresseingabe
  7027.     ENDSELECT
  7028.     '
  7029.     ' Beenden des Dialogs
  7030.     rsc_back(adressbaum&)
  7031.     @select(adressbaum_adr%,ex_obj%,FALSE)
  7032.     '
  7033.     ' Eingaben auslesen
  7034.     drittschuldneranrede1$=CHAR{{OB_SPEC(adressbaum_adr%,anrede1&)}}
  7035.     drittschuldneranrede2$=CHAR{{OB_SPEC(adressbaum_adr%,anrede2&)}}
  7036.     drittschuldnerstrasse$=CHAR{{OB_SPEC(adressbaum_adr%,strasse&)}}
  7037.     drittschuldnerort$=CHAR{{OB_SPEC(adressbaum_adr%,ort&)}}
  7038.     drittschuldnergf1$=CHAR{{OB_SPEC(adressbaum_adr%,gf1&)}}
  7039.     drittschuldnergf2$=CHAR{{OB_SPEC(adressbaum_adr%,gf2&)}}
  7040.     ' ++++++++++++++
  7041.     ' Anspruchsarten-Dialobox
  7042.     pfuebbaum_adr%=rsc_adr%(pfuebbaum&)  ! WELCHEN ANSPRUCH PFÄNDEN?
  7043.     FOR i%=dsaa& TO dsladen&
  7044.       @select(pfuebbaum_adr%,i%,FALSE)  ! Andere Buttons deselektieren
  7045.     NEXT i%
  7046.     @select(pfuebbaum_adr%,dsag&,TRUE)  ! Arbeitgeber voreinstellen
  7047.     '
  7048.     ' Vorbereitung des Dialogs
  7049.     rsc_draw(pfuebbaum&,fensterdial%)
  7050.     '
  7051.     ' Duchführen des Dialogs
  7052.     REPEAT  ! bis OK oder Abbruch angewählt
  7053.       ex_obj%=@rsc_do(pfuebbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  7054.       '
  7055.       ' Beenden des Dialogs
  7056.       ' Überprüfen der Auswahl
  7057.       FOR i%=dsaa& TO dsladen&
  7058.         GOSUB is_objc(pfuebbaum_adr%,i%,1,*ergebnis%)
  7059.         IF ergebnis%=1
  7060.           welcher_anspruch%=i%-dsaa&+1
  7061.         ENDIF
  7062.       NEXT i%
  7063.       IF welcher_anspruch%=9
  7064.         pfad#=GEMDOS(25)+65  !AKTUELLES LAUFWERK
  7065.         pfad$=CHR$(pfad#)+":"+DIR$(0)+"\PRT\ANSPRUCH\*.TXT"
  7066.         dateiname$=@fileselect$("Anspruchstext laden",pfad$,"LADE.TXT")
  7067.         IF EXIST(dateiname$)
  7068.           OPEN "I",#1,dateiname$
  7069.           l%=LOF(#1)
  7070.           anspruch$(9)=INPUT$(l%,#1)
  7071.           CLOSE #1
  7072.         ELSE
  7073.           dummy%=@rsc_alert(1,"Die gewählte Datei|existiert nicht."," [OK ",1)
  7074.         ENDIF
  7075.       ENDIF
  7076.     UNTIL ex_obj%=dsfertig& OR ex_obj%=dsabbruc&
  7077.     rsc_back(pfuebbaum&)
  7078.     @select(pfuebbaum_adr%,ex_obj%,FALSE)
  7079.     IF ex_obj%=dsabbruc&
  7080.       abbruch%=TRUE  ! damit nachfolgende Dialoge durchschleifen
  7081.       druckabbruch%=TRUE
  7082.       GOTO nachtexteingaben_ende
  7083.     ENDIF
  7084.   ENDSELECT
  7085.   '
  7086.   ' ++++++++++++++++++++++++++++++
  7087.   ' BESONDERE ANWEISUNGEN/ERGÄNZUNGEN
  7088.   ' ++++++++++++++++++++++++++
  7089.   besanwbaum_adr%=rsc_adr%(besanwbaum&)
  7090.   FOR i&=zusatz01& TO zusatz12&  ! Zusatztexte löschen
  7091.     CHAR{{OB_SPEC(besanwbaum_adr%,i&)}}=""
  7092.   NEXT i&
  7093.   CHAR{{OB_SPEC(besanwbaum_adr%,anzkop&)}}=STR$(kopienanzahl%,2)
  7094.   @select(besanwbaum_adr%,copystop&,copystop%)
  7095.   erstes_objekt%=zusatz01&
  7096.   ' Vorbereitung des Dialogs
  7097.   rsc_draw(besanwbaum&,fensterdial%)
  7098.   '
  7099.   ' Duchführen des Dialogs
  7100.   DO
  7101.     ex_obj%=@rsc_do(besanwbaum&,zusatz01&,dummy&)  ! dummy, da kein Popupmenu in der Box
  7102.     SELECT ex_obj%
  7103.     CASE zielpop&,zieloption&,zielcircle&
  7104.       druckziel%=@rsc_read_popup(besanwbaum&,zielpop&)
  7105.     DEFAULT
  7106.       EXIT IF 1=1
  7107.     ENDSELECT
  7108.   LOOP
  7109.   '
  7110.   ' Beenden des Dialogs
  7111.   @rsc_back(besanwbaum&)
  7112.   @select(besanwbaum_adr%,ex_obj%,FALSE)
  7113.   '
  7114.   IF ex_obj%=zusatzok&
  7115.     ' einlesen der Ergänzungstexte
  7116.     bes_anweisung$=""
  7117.     FOR i&=zusatz01& TO zusatz12&  ! Zusatztexte lesen
  7118.       bes_anweisung$=bes_anweisung$+CHAR{{OB_SPEC(besanwbaum_adr%,i&)}}
  7119.     NEXT i&
  7120.     kopienanzahl%=VAL(CHAR{{OB_SPEC(besanwbaum_adr%,anzkop&)}})
  7121.     IF copystop%<>@selected(besanwbaum_adr%,copystop&)  ! wenn geändert
  7122.       optionsaenderung%=TRUE
  7123.     ENDIF
  7124.     copystop%=@selected(besanwbaum_adr%,copystop&)
  7125.     IF druckziel%=1  ! auf Drucker
  7126.     ELSE IF druckziel%=2   ! in Datei
  7127.       @gebuehren_berechnen_und_buchen
  7128.       @ausgabestring_erstellen(TRUE)  ! mit Steuerzeichen
  7129.       @ausgabeumwandlung(ausgabe$,ausgabe$)
  7130.       @als_text_speichern(1,"")
  7131.       druckabbruch%=TRUE
  7132.     ELSE IF druckziel%=3  ! in ASCII-Datei
  7133.       @gebuehren_berechnen_und_buchen
  7134.       @ausgabestring_erstellen(FALSE)  ! ohne Steuerzeichen
  7135.       @als_text_speichern(1,"")
  7136.       druckabbruch%=TRUE
  7137.     ELSE IF druckziel%=4   ! aufs Clipboard (ASCII-Datei)
  7138.       @gebuehren_berechnen_und_buchen
  7139.       @ausgabestring_erstellen(FALSE)  ! ohne Steuerzeichen
  7140.       @als_text_speichern(2,"")
  7141.       druckabbruch%=TRUE
  7142.     ENDIF
  7143.   ELSE IF ex_obj%=zusatzab&
  7144.     druckabbruch%=TRUE
  7145.   ENDIF
  7146. nachtexteingaben_ende:
  7147. RETURN
  7148. ' *************************************************************************
  7149. '
  7150. ' ERSTELLUNG DER AUSDRUCKE DER ZWANGSVOLLSTRECKUNG
  7151. '
  7152. ' ********************************************************************
  7153. > PROCEDURE kurzdruck
  7154.   GOSUB freiezeilefinden(1,freiezeile%)
  7155.   IF freiezeile%=1
  7156.     ' Abbrechen wenn keine Fdg-berechnung im Speicher ist
  7157.     ~@rsc_alert(1,"Keine druckbare Berechnung|im Speicher !","[Abbruch",1)
  7158.     druckabbruch%=TRUE
  7159.     GOTO kurzdruckende
  7160.   ENDIF
  7161.   ' DRUCKER AUF EMPFANGSBEREITSCHAFT TESTEN
  7162.   IF OUT?(0)=FALSE ! GEMDOS(17)
  7163.     IF @rsc_alert(1,"Bitte Schalten Sie|Ihren Drucker ein.","[Abbruch|[OK",2)=1
  7164.       druckabbruch%=TRUE
  7165.       GOTO kurzdruckende
  7166.     ENDIF
  7167.   ENDIF
  7168.   DEFMOUSE 2
  7169.   wasdrucken%=29
  7170.   GOSUB ausgabestring_erstellen(TRUE)  ! mit Steuerzeichen
  7171.   GOSUB initialisierung
  7172.   PRINT #0;overlayaufruf$;
  7173.   '
  7174.   ' EINSETZEN DER STEUERZEICHEN FÜR DEN LINKEN RAND
  7175.   pos%=INSTR(linkerrand$,CHR$(255))  ! CHR 255 wird durch STRING abstand_von_links ersetzt
  7176.   IF pos%>0  ! D.h. Steuercode enthält CHR$(255)
  7177.     PRINT #0;LEFT$(linkerrand$,pos%-1);abstand_von_links%;MID$(linkerrand$,pos%+1);
  7178.   ENDIF
  7179.   pos%=INSTR(linkerrand$,CHR$(254))  ! CHR 254 wird durch CHR$(abstand_von_links) ersetzt
  7180.   IF pos%>0  ! D.h. Steuercode enthält CHR$(254)
  7181.     PRINT #0;LEFT$(linkerrand$,pos%-1);CHR$(abstand_von_links%);MID$(linkerrand$,pos%+1);
  7182.   ENDIF
  7183.   '
  7184.   ' EINSETZEN DER STEUERZEICHEN FÜR DIE SEITENLÄNGE
  7185.   pos%=INSTR(seitenlaenge$,CHR$(255))  ! CHR 255 wird durch STRING abstand_von_links ersetzt
  7186.   IF pos%>0  ! D.h. Steuercode enthält CHR$(255)
  7187.     PRINT #0;LEFT$(seitenlaenge$,pos%-1);seitenlaenge%;MID$(seitenlaenge$,pos%+1);
  7188.   ENDIF
  7189.   pos%=INSTR(seitenlaenge$,CHR$(254))  ! CHR 254 wird durch CHR$(abstand_von_links) ersetzt
  7190.   IF pos%>0  ! D.h. Steuercode enthält CHR$(254)
  7191.     PRINT #0;LEFT$(seitenlaenge$,pos%-1);CHR$(seitenlaenge%);MID$(linkerrand$,pos%+1);
  7192.   ENDIF
  7193.   '
  7194.   ' oberer Abstand
  7195.   aktuelle_druckzeile%=1
  7196.   seitennummer%=1
  7197.   FOR a%=1 TO abstand_von_oben%+abstand_kopf_vom_oberen_druckrand%
  7198.     ' Ab Seite 2 macht das PROCEDURE formfeed; auf Seite 1 muß auch noch der
  7199.     ' Kopfabstand berücksichtigt werden
  7200.     PRINT #0  ! Oberer Abstand
  7201.     INC aktuelle_druckzeile%
  7202.   NEXT a%
  7203.   GOSUB zeilendruck(ausgabe$)
  7204.   PRINT #0;formfeed$;nachspann$; ! Auswurf des letzten Blattes ohne CR/LF
  7205. kurzdruckende:
  7206. RETURN
  7207. ' *****************************************************************
  7208. > PROCEDURE druck
  7209.   druckabbruch%=FALSE
  7210.   DEFMOUSE 0
  7211.   druckoptbaum_adr%=rsc_adr%(druckoptbaum&)
  7212.   @dialog_positionieren(druckoptbaum&)
  7213.   '
  7214.   ' ++ VOREINSTELLUNG BUTTONS ++
  7215.   FOR i%=d367& TO dgeladen&
  7216.     @select(druckoptbaum_adr%,i%,FALSE)  ! Alles außer ZVA deselektieren
  7217.     ' Sortierung vorausgesetzt
  7218.   NEXT i%
  7219.   @select(druckoptbaum_adr%,dzva&,TRUE)  ! Vorwahl Zwangsvollstreckungsauftrag
  7220.   @select(druckoptbaum_adr%,mitgebue&,TRUE)  ! Vorwahl Gebühren ja
  7221.   IF mitmwst%=1
  7222.     @select(druckoptbaum_adr%,mitmwst&,TRUE)  ! Vorwahl MwSt ja
  7223.   ELSE
  7224.     @select(druckoptbaum_adr%,mitmwst&,FALSE)  ! Vorwahl MwSt aus
  7225.   ENDIF
  7226.   @select(druckoptbaum_adr%,dteilvollstrckg&,FALSE)  ! Vorwahl Gesamtbetrag vollstrecken
  7227.   GOSUB del_flag(druckoptbaum_adr%,dteilbetraghoehe&,8) ! uneditierbar
  7228.   GOSUB do_objc(druckoptbaum_adr%,dteilbetraghoehe&,&H8) ! helle Darstellung
  7229.   CHAR{{OB_SPEC(druckoptbaum_adr%,dteilbetraghoehe&)}}=""  ! Feld löschen
  7230.   ' für Erhöhung bei mehreren Gläubigern nach § 6 BRAGO
  7231.   CHAR{{OB_SPEC(druckoptbaum_adr%,dglaeubigerzahl&)}}=STR$(MAX(1,mb_aszahl%),2)
  7232.   ' +++DIALOG+++++
  7233.   ' Vorbereitung des Dialogs
  7234.   rsc_draw(druckoptbaum&,fensterdial%)
  7235.   '
  7236.   ' Duchführen des Dialogs
  7237. nochmal_druckoptionen:
  7238.   ex_obj%=@rsc_do(druckoptbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  7239.   SELECT ex_obj%
  7240.   CASE dgeladen&  ! Datei aus Bibliothek laden
  7241.     pfad$=boot_pfad$+"\PRT\MUSTER\*.MSB"  ! MSB=Musterbibliothek (damit Systemmuster nicht mit aufgelistet werden)
  7242.     dummy$=@fileselect$("Vollstreckungsmuster laden",pfad$,"EIGENES.MSB")
  7243.     IF dummy$="" OR RIGHT$(dummy$)="\"  ! Auswahl abgebrochen
  7244.       dummy$="*MSB"
  7245.     ELSE  ! Datei ausgewählt
  7246.       GOSUB text_in_string_laden(dummy$,a$)
  7247.       muster$(28)=a$  ! reserviert für Texte aus Muster-Bibliothek
  7248.       dummy$=MID$(dummy$,RINSTR(dummy$,"\")+1)  ! Dateiname ohne Pfad anzeigen
  7249.     ENDIF
  7250.     CHAR{{OB_SPEC(druckoptbaum_adr%,dladedatei&)}}=dummy$ ! zeigt Dateinamen an
  7251.     @objc_update(druckoptbaum_adr%,dladedatei&)
  7252.     GOTO nochmal_druckoptionen
  7253.   CASE dteilvollstrckg&
  7254.     IF @selected(druckoptbaum_adr%,dteilvollstrckg&)  ! gerade angewählt
  7255.       @set_flag(druckoptbaum_adr%,dteilbetraghoehe&,8) ! editierbar
  7256.       @undo_objc(druckoptbaum_adr%,dteilbetraghoehe&,&H8) ! dunkle Darstellung
  7257.       @objc_update(druckoptbaum_adr%,dteilbetraghoehe&)  ! neu zeichnen
  7258.     ELSE  ! Teilvollstreckung gerade deselektiert
  7259.       @del_flag(druckoptbaum_adr%,dteilbetraghoehe&,8) ! uneditierbar
  7260.       @do_objc(druckoptbaum_adr%,dteilbetraghoehe&,&H8) ! dunkle Darstellung
  7261.       @objc_update(druckoptbaum_adr%,dteilbetraghoehe&)  ! neu zeichnen
  7262.     ENDIF
  7263.     GOTO nochmal_druckoptionen
  7264.   CASE dausgang&  ! Logikkontrolle Teilvollstreckung
  7265.     IF @selected(druckoptbaum_adr%,dteilvollstrckg&)  ! gerade angewählt
  7266.       @zahlenumwandlung(10,CHAR{{OB_SPEC(druckoptbaum_adr%,dteilbetraghoehe&)}},teilbetrag#,dummy#)
  7267.       @freiezeilefinden(1,freiezeile%)
  7268.       gesamtsumme#=ROUND(betrag#(freiezeile%-1),2)+ROUND(restbetrag#(freiezeile%-1),2)+ROUND(zinssatz#(freiezeile%-1),2)+ROUND(kzins#(freiezeile%-1),2)
  7269.       IF teilbetrag#>=gesamtsumme#
  7270.         ~@rsc_alert(1,"Teilvollstreckungsbetrag|wurde zu hoch gewählt !|Bitte korrigieren.","[OK",1)
  7271.         @select(druckoptbaum_adr%,ex_obj%,FALSE)
  7272.         @objc_update(druckoptbaum_adr%,ex_obj%)  ! neu zeichnen
  7273.         GOTO nochmal_druckoptionen
  7274.       ENDIF
  7275.     ENDIF
  7276.     ' Für Erhöhung bei mehreren Antragstellern
  7277.     mb_aszahl%=VAL(TRIM$(CHAR{{OB_SPEC(druckoptbaum_adr%,dglaeubigerzahl&)}}))
  7278.   ENDSELECT
  7279.   '
  7280.   ' Beenden des Dialogs
  7281.   rsc_back(druckoptbaum&)
  7282.   @select(druckoptbaum_adr%,ex_obj%,FALSE)
  7283.   IF ex_obj%=dabbruch&
  7284.     druckabbruch%=TRUE
  7285.     GOTO druckende
  7286.   ENDIF
  7287.   '
  7288.   ' +++ AUSWERTUNG DER BUTTONS+++
  7289.   ' WAS SOLL GEDRUCKT WERDEN ?
  7290.   ' Abfrage der Buttons
  7291.   FOR i%=d367& TO dgeladen&
  7292.     GOSUB is_objc(druckoptbaum_adr%,i%,1,*ergebnis%)
  7293.     EXIT IF ergebnis%=1
  7294.   NEXT i%
  7295.   SELECT i%
  7296.   CASE d367&  ! Forderungsberechnung nach § 367
  7297.     wasdrucken%=1
  7298.   CASE dzva&  ! Zwangsvollstreckungsantrag
  7299.     wasdrucken%=2
  7300.   CASE dpfueb&  ! Pfändungs- und Überweisungsbeschluß
  7301.     wasdrucken%=3
  7302.   CASE deva&  ! Eidesst. Versicherung
  7303.     wasdrucken%=4
  7304.   CASE deverg&  ! Ergänzung der eidesstattliche Versicherung
  7305.     wasdrucken%=16
  7306.   CASE devneu&  ! erneute Abgabe der eV vor Ablauf der 3-Jahresfrist
  7307.     wasdrucken%=17
  7308.   CASE dpfverh&  ! Pfändungs- und Verhaftungsauftrag
  7309.     wasdrucken%=5
  7310.   CASE ddurchs& ! DURCHSUCHUNGSANTRAG
  7311.     wasdrucken%=6
  7312.   CASE dzahlver&  !ZAHLUNGSVERBOT
  7313.     wasdrucken%=7
  7314.   CASE d840zpo&  ! AUFFORDERUNG Z. DS-AUSKUNFT
  7315.     wasdrucken%=8
  7316.   CASE dpanfrag&  ! POSTANFRAGE
  7317.     wasdrucken%=9
  7318.   CASE dema&  ! MELDEAMTSANFRAGE
  7319.     wasdrucken%=10
  7320.   CASE dandrohg&  ! Vollstreckungsandrohung
  7321.     wasdrucken%=11
  7322.   CASE dratenvg&  ! Ratenvergleich
  7323.     wasdrucken%=12
  7324.   CASE dsihyp&  ! Sicherungshypothek
  7325.     wasdrucken%=13
  7326.   CASE dsivstr&  ! Sicherungsvollstreckung
  7327.     wasdrucken%=14
  7328.   CASE dverhaft&  ! Nur Verhaftung ohne Vollstreckung
  7329.     wasdrucken%=15
  7330.   CASE dgeladen&  ! Mustertext aus Muster-Bibliothek (*.MSB)
  7331.     wasdrucken%=28
  7332.   ENDSELECT
  7333.   '
  7334.   ' +++ Mehrwertsteuer angewählt ? +++
  7335.   GOSUB is_objc(druckoptbaum_adr%,mitmwst&,1,*ergebnis%)
  7336.   IF ergebnis%=1
  7337.     mitmwst%=1
  7338.   ELSE
  7339.     mitmwst%=0
  7340.   ENDIF
  7341.   '
  7342.   ' +++ Gebühren DAZUSETZEN ? +++
  7343.   GOSUB is_objc(druckoptbaum_adr%,mitgebue&,1,*ergebnis%)
  7344.   IF ergebnis%=1
  7345.     mitgeb%=1
  7346.   ELSE
  7347.     mitgeb%=0
  7348.   ENDIF
  7349.   SELECT wasdrucken%
  7350.   CASE 1,6,7,8,15,16 ! §367-ABRECHNUNG IMMER OHNE GEBÜHREN, EV-ERGÄNZUNG AUCH
  7351.     ' DURCHSUCHUNGSAUFTRAG, ZAHLUNGSVERBOT, DS-MAHNUNG (840) AUCH OHNE GEBÜHREN
  7352.     mitgeb%=0
  7353.   ENDSELECT
  7354.   '
  7355.   ' ++++++++++++++++++
  7356.   ' ADRESSATEINGABEN
  7357.   GOSUB adressateingabe
  7358.   IF druckabbruch%=TRUE !  Möglichkeit zum Abbruch
  7359.     GOTO druckende
  7360.   ENDIF
  7361.   '
  7362.   ' +++++++++++++++
  7363.   ' FESTLEGUNG DER ZU DRUCKENDEN EXEMPLARE
  7364.   SELECT wasdrucken%
  7365.   CASE 1  ! § 367
  7366.     kopienanzahl%=kopienzahl367%
  7367.   CASE 2  ! ZVA
  7368.     kopienanzahl%=kopienzahlzva%
  7369.   CASE 3  !  PFUEB
  7370.     kopienanzahl%=kopienzahlpfueb%
  7371.   CASE 4,16,17  ! EV-ANTRAG, EV-ERGÄNZUNG, EV-NEU
  7372.     kopienanzahl%=kopienzahleva%
  7373.   CASE 5,15  !  PF+VERH, ISOLIERTE VERHAFTUNG
  7374.     kopienanzahl%=kopienzahlpfverh%
  7375.   CASE 6  !  DURCHSUCHUNGSANTRAG
  7376.     kopienanzahl%=kopienzahldurchs%
  7377.   CASE 7  !  ZAHLUNGSVERBOT
  7378.     kopienanzahl%=kopienzahlzahlverb%
  7379.   CASE 8  ! DRITTSCHULDNERANMAHNUNG § 840 ZPO
  7380.     kopienanzahl%=kopienzahl840%
  7381.   CASE 9  !  POSTANFRAGE
  7382.     kopienanzahl%=kopienzahlpanfr%
  7383.   CASE 10  !  MELDEAMTSANFRAGE
  7384.     kopienanzahl%=kopienzahlema%
  7385.   CASE 11  !  ZV Androhung
  7386.     kopienanzahl%=kopienzahlzvandrohg%
  7387.   CASE 12  ! Ratenvergleich
  7388.     kopienanzahl%=kopienzahlratenvgl%
  7389.   CASE 13  !  Sicherungshypothek
  7390.     kopienanzahl%=kopienzahlsihyp%
  7391.   CASE 14  !  Sicherungsvollstreckung
  7392.     kopienanzahl%=kopienzahlsivollstr%
  7393.   DEFAULT  ! z.B. für Bibliotheksausdrucke
  7394.     kopienanzahl%=1
  7395.   ENDSELECT
  7396.   '
  7397.   ' +++ NACHTEXTEINGABEN +++
  7398.   ' Nachtexteingaben erst nach Bestimmung der Kopienzahl wg. Anzeige derselben
  7399.   GOSUB nachtexteingaben  ! = BESONDERE ANWEISUNGEN
  7400.   IF druckabbruch%=TRUE ! Bei der Zusatzeingabe letzte Möglichkeit zum Abbruch
  7401.     GOTO druckende
  7402.   ENDIF
  7403.   '
  7404.   ' +++ Jetzt folgt Rechenzeit +++
  7405.   GOSUB mausform(9)  ! Kaffeetasse
  7406.   '
  7407.   '
  7408.   @gebuehren_berechnen_und_buchen
  7409.   '
  7410.   ' +++ ERSTELLEN DES AUSGABESTRINGS +++
  7411.   GOSUB ausgabestring_erstellen(TRUE)  ! mit Steuerzeichen
  7412.   '
  7413.   ' +++++ DRUCKBEGINN +++++
  7414.   GOSUB mausform(9)  ! Kaffeetasse
  7415.   IF OUT?(0)=FALSE  !GEMDOS(17)=0 ! Drucker ansprechbar ?
  7416.     DEFMOUSE 0
  7417.     IF @rsc_alert(1,"Ihr Drucker nimmt gerade|keine Daten ab.|Bitte einschalten !","[OK|[Abbruch",1)=2
  7418.       druckabbruch%=1
  7419.       GOTO druckende
  7420.     ELSE
  7421.       GOSUB mausform(9)  ! Kaffeetasse
  7422.     ENDIF
  7423.   ENDIF
  7424.   '
  7425.   ' EINSETZEN DER STEUERZEICHEN FÜR KOPIENZAHL (LASERDRUCKER)
  7426.   IF LEN(kopienzahl$)>0  ! Also Steuercode angegeben
  7427.     pos%=INSTR(kopienzahl$,CHR$(255))  ! CHR 255 wird durch STRING kopienzahl% ersetzt
  7428.     IF pos%>0  ! D.h. chr$(255) enthalten
  7429.       PRINT #0;LEFT$(kopienzahl$,pos%-1);kopienanzahl%;MID$(kopienanzahl$,pos%+1);
  7430.     ENDIF
  7431.     pos%=INSTR(kopienzahl$,CHR$(254))  ! CHR 254 wird durch CHR$(kopienzahl%) ersetzt
  7432.     IF pos%>0  ! D.h. chr$(254) enthalten
  7433.       PRINT #0;LEFT$(kopienzahl$,pos%-1);CHR$(kopienanzahl%);MID$(kopienanzahl$,pos%+1);
  7434.     ENDIF
  7435.     kopienanzahl%=1  ! Da ja jedes Blatt gleich x-mal ausgeworfen wird
  7436.   ENDIF
  7437.   ' ++++++++++++++
  7438.   '
  7439.   ' +++ DRUCKSCHLEIFE +++
  7440.   FOR durchlauf%=1 TO kopienanzahl%  ! i% wird woanders verwendet !!!
  7441.     IF copystop%=TRUE  ! Bei jeder Kopie anhalten, damit man Briefköpfe einlegen kann
  7442.       DEFMOUSE 0
  7443.       IF @rsc_alert(1,"Bitte Papier für Seite 1|einlegen. Ich drucke dann|die "+STR$(durchlauf%)+". Kopie.","[OK|[Abbruch",1)=2
  7444.         EXIT IF 0=0  ! Dummyabfrage um den Druck abzubrechen
  7445.       ENDIF
  7446.       @mausform(9)
  7447.     ENDIF
  7448.     @initialisierung
  7449.     PRINT #0;overlayaufruf$;
  7450.     '
  7451.     ' EINSETZEN DER STEUERZEICHEN FÜR DEN LINKEN RAND
  7452.     pos%=INSTR(linkerrand$,CHR$(255))  ! CHR 255 wird durch STRING abstand_von_links ersetzt
  7453.     IF pos%>0  ! D.h. Steuercode enthält CHR$(255)
  7454.       PRINT #0;LEFT$(linkerrand$,pos%-1);abstand_von_links%;MID$(linkerrand$,pos%+1);
  7455.     ENDIF
  7456.     pos%=INSTR(linkerrand$,CHR$(254))  ! CHR 254 wird durch CHR$(abstand_von_links) ersetzt
  7457.     IF pos%>0  ! D.h. Steuercode enthält CHR$(254)
  7458.       PRINT #0;LEFT$(linkerrand$,pos%-1);CHR$(abstand_von_links%);MID$(linkerrand$,pos%+1);
  7459.     ENDIF
  7460.     '
  7461.     ' EINSETZEN DER STEUERZEICHEN FÜR DIE SEITENLÄNGE
  7462.     pos%=INSTR(seitenlaenge$,CHR$(255))  ! CHR 255 wird durch STRING abstand_von_links ersetzt
  7463.     IF pos%>0  ! D.h. Steuercode enthält CHR$(255)
  7464.       PRINT #0;LEFT$(seitenlaenge$,pos%-1);seitenlaenge%;MID$(seitenlaenge$,pos%+1);
  7465.     ENDIF
  7466.     pos%=INSTR(seitenlaenge$,CHR$(254))  ! CHR 254 wird durch CHR$(abstand_von_links) ersetzt
  7467.     IF pos%>0  ! D.h. Steuercode enthält CHR$(254)
  7468.       PRINT #0;LEFT$(seitenlaenge$,pos%-1);CHR$(seitenlaenge%);MID$(linkerrand$,pos%+1);
  7469.     ENDIF
  7470.     '
  7471.     ' oberer Abstand
  7472.     aktuelle_druckzeile%=1
  7473.     seitennummer%=1
  7474.     FOR a%=1 TO abstand_von_oben%+abstand_kopf_vom_oberen_druckrand%
  7475.       ' Ab Seite 2 macht das PROCEDURE formfeed; auf Seite 1 muß auch noch der
  7476.       ' Kopfabstand berücksichtigt werden
  7477.       PRINT #0  ! Oberer Abstand
  7478.       INC aktuelle_druckzeile%
  7479.     NEXT a%
  7480.     GOSUB zeilendruck(ausgabe$)
  7481.     PRINT #0;formfeed$;nachspann$; ! Auswurf des letzten Blattes ohne CR/LF
  7482.   NEXT durchlauf%
  7483. druckende:
  7484.   @redraw_part(0,0)
  7485.   DEFMOUSE 0
  7486. RETURN
  7487. ' ***********************************************************
  7488. > PROCEDURE ausgabestring_erstellen(mit_steuerzeichen%)
  7489.   GOSUB mausform(9)  ! Kaffeetasse
  7490.   ' ++++++++++++++++++++++++++++++++
  7491.   ' INITIALISIERUNG DES AUSGABESTRINGS
  7492.   ' +++++++++++++++++++++++++++++++++++
  7493.   ausgabe$=muster$(wasdrucken%)
  7494.   '
  7495.   ' +++++++++++++++++++++
  7496.   ' Positionen der Schlüsselwörter ermitteln
  7497.   ' +++++++++++++++++++++++++++++++++
  7498.   start_pos%=0  ! Von ganz vorne anfangen
  7499.   DO
  7500.     pos1%=INSTR(ausgabe$,"{",start_pos%)  ! bei Start_pos% anfangen
  7501.     pos2%=INSTR(ausgabe$,"}",pos1%+1)
  7502.     EXIT IF pos2%=0  ! Dann kein Schlüsselwort mehr da
  7503.     keyword$=MID$(ausgabe$,pos1%+1,pos2%-pos1%-1)
  7504.     GOSUB keyword_auswerten(keyword$,mit_steuerzeichen%,a$)
  7505.     ausgabe$=LEFT$(ausgabe$,pos1%-1)+a$+MID$(ausgabe$,pos2%+1)
  7506.     start_pos%=pos1%+LEN(a$)  ! Erst nach dem eingesetzten String weitersuchen
  7507.   LOOP
  7508. RETURN
  7509. ' ********************************************************************
  7510. > PROCEDURE keyword_auswerten(key$,mitstz%,VAR einsetz$)
  7511.   '  mitstz%=TRUE >> incl. Steuerzeichen für den Drucker, False: keine Auswertung
  7512.   einsetz$=""
  7513.   '
  7514.   ' ++++++++++++++++++++++++
  7515.   ' ADRESSATENDATEN
  7516.   IF key$="adressatname1"
  7517.     einsetz$=adressatanrede1$
  7518.   ELSE IF key$="adressatname2"
  7519.     einsetz$=adressatanrede2$
  7520.   ELSE IF key$="adressatstr"
  7521.     einsetz$=adressatstrasse$
  7522.   ELSE IF key$="adressatort"
  7523.     einsetz$=adressatort$
  7524.   ELSE IF key$="adressatgf1"
  7525.     IF adressatgf1$<>""
  7526.       einsetz$="vertreten durch "+adressatgf1$+" "
  7527.     ENDIF
  7528.   ELSE IF key$="adressatgf2"
  7529.     einsetz$=adressatgf2$
  7530.     '
  7531.     '
  7532.     ' ++++++++++++++++++++++++
  7533.     ' DRITTSCHULDNERDATEN
  7534.   ELSE IF key$="drittschuldnername1"
  7535.     einsetz$=drittschuldneranrede1$
  7536.   ELSE IF key$="drittschuldnername2"
  7537.     einsetz$=drittschuldneranrede2$
  7538.   ELSE IF key$="drittschuldnername"
  7539.     einsetz$=drittschuldneranrede1$+" "+drittschuldneranrede2$
  7540.   ELSE IF key$="drittschuldnerstr"
  7541.     einsetz$=drittschuldnerstrasse$
  7542.   ELSE IF key$="drittschuldnerort"
  7543.     einsetz$=drittschuldnerort$
  7544.   ELSE IF key$="drittschuldnergf1"
  7545.     IF drittschuldnergf1$<>""
  7546.       einsetz$="vertreten durch "+drittschuldnergf1$+" "
  7547.     ENDIF
  7548.   ELSE IF key$="drittschuldnergf2"
  7549.     einsetz$=drittschuldnergf2$
  7550.   ELSE IF key$="drittschuldnergf"
  7551.     IF drittschuldnergf1$<>""
  7552.       einsetz$="vertreten durch "+drittschuldnergf1$+" "+drittschuldnergf2$
  7553.     ENDIF
  7554.     '
  7555.     '
  7556.     ' ++++++++++++++++++++++++
  7557.     ' GLÄUBIGERDATEN
  7558.   ELSE IF key$="glaeubigername"
  7559.     einsetz$=glaeubigeranrede1$
  7560.   ELSE IF key$="glaeubigerstr"
  7561.     einsetz$=glaeubigerstrasse$
  7562.   ELSE IF key$="glaeubigerort"
  7563.     einsetz$=glaeubigerort$
  7564.   ELSE IF key$="glaeubigergf"
  7565.     IF glaeubigergf1$<>""
  7566.       einsetz$="vertreten durch "+glaeubigergf1$
  7567.     ENDIF
  7568.     '
  7569.     '
  7570.     ' ++++++++++++++++++++++++
  7571.     ' SCHULDNERDATEN
  7572.   ELSE IF key$="schuldnername"
  7573.     einsetz$=schuldneranrede1$
  7574.   ELSE IF key$="schuldnerstr"
  7575.     einsetz$=schuldnerstrasse$
  7576.   ELSE IF key$="schuldnerort"
  7577.     einsetz$=schuldnerort$
  7578.   ELSE IF key$="schuldnergf"
  7579.     IF schuldnergf1$<>""
  7580.       einsetz$="vertreten durch "+schuldnergf1$
  7581.     ENDIF
  7582.     '
  7583.     '
  7584.     ' ++++++++++++++++++++++++
  7585.     ' USERDATEN
  7586.   ELSE IF key$="username1"
  7587.     einsetz$=useranrede1$
  7588.   ELSE IF key$="username2"
  7589.     einsetz$=useranrede2$
  7590.   ELSE IF key$="userstr"
  7591.     einsetz$=userstr$
  7592.   ELSE IF key$="userort"  ! Ohne PLZ
  7593.     einsetz$=MID$(userort$,INSTR(userort$," ")+1)
  7594.   ELSE IF key$="userplz"
  7595.     einsetz$=LEFT$(userort$,5)
  7596.   ELSE IF key$="userkonto"
  7597.     einsetz$=userkto$
  7598.   ELSE IF key$="userbank"
  7599.     einsetz$=userbank$
  7600.   ELSE IF key$="userblz"
  7601.     einsetz$=userblz$
  7602.     '
  7603.     '
  7604.     ' +++++++++++++++++++++++++++++
  7605.     ' TITELDATEN
  7606.   ELSE IF key$="titelart"
  7607.     einsetz$=titelart$
  7608.   ELSE IF key$="titelaz"
  7609.     einsetz$=titelaz$
  7610.   ELSE IF key$="titeldatum"
  7611.     einsetz$=LEFT$(titeldatum$,2)+"."+MID$(titeldatum$,3,2)+"."+MID$(titeldatum$,5,2)
  7612.   ELSE IF key$="titelgericht"
  7613.     einsetz$=titelgericht$
  7614.   ELSE IF key$="titelort"
  7615.     einsetz$=titelort$
  7616.     '
  7617.     '
  7618.     ' ++++++++++++++++++++++++
  7619.     ' SONSTIGE DATEN
  7620.   ELSE IF key$="abkuerzungen"
  7621.     einsetz$=abk$
  7622.   ELSE IF key$="verrechnungsart"
  7623.     IF verrechnungsart#<=2  ! 367 oder Beschiß-367
  7624.       einsetz$="§ 367 BGB"
  7625.     ELSE  ! Kreditverbrauchergesetz
  7626.       einsetz$="KrVerbrG"
  7627.     ENDIF
  7628.   ELSE IF key$="anspruchsbezeichnung"
  7629.     einsetz$=anspruch$(welcher_anspruch%)
  7630.   ELSE IF key$="az"
  7631.     einsetz$=az$
  7632.   ELSE IF key$="besondereanweisung"
  7633.     einsetz$=bes_anweisung$
  7634.   ELSE IF key$="datum"
  7635.     einsetz$=DATE$
  7636.   ELSE IF key$="tageszinsen"
  7637.     einsetz$=@dez_komma$(tageszinsen#,0,2,TRUE)
  7638.   ELSE IF key$="abrechnungsdatum"
  7639.     @datums_rueckumwandlung(abrechnungsdatum%,t%,m%,j%)
  7640.     @datumsstring_erstellen(t%,m%,j%,2,einsetz$)
  7641.   ELSE IF key$="gesamtforderung"
  7642.     FOR a%=0 TO maximalbuchungen%
  7643.       EXIT IF fdgart#(a%)=25
  7644.     NEXT a%
  7645.     einsetz$=@dez_komma$(zinsdatum%(a%)/100,0,2,TRUE)
  7646.   ELSE IF key$="ueberzahlung"
  7647.     IF ueberzahlung#>0
  7648.       einsetz$="Die Überzahlung von DM "+@dez_komma$(ueberzahlung#,0,2,TRUE)+" wird auf Antrag ausbezahlt."
  7649.     ENDIF  ! sonst Leerstring
  7650.   ELSE IF key$="forderungsberechnung"
  7651.     GOSUB forderungsstring(mitstz%,einsetz$)
  7652.   ELSE IF key$="gebuehrenberechnung"
  7653.     GOSUB gebuehrenstring(mitstz%,einsetz$)
  7654.   ELSE IF key$="zeit"
  7655.     einsetz$=TIME$
  7656.   ELSE IF key$="unterschrift"
  7657.     einsetz$=unterschriftsleiste$
  7658.   ELSE IF key$="teilvollstreckung"
  7659.     IF @selected(druckoptbaum_adr%,dteilvollstrckg&)  ! Teilvollstreckung machen
  7660.       @zahlenumwandlung(9,CHAR{{OB_SPEC(druckoptbaum_adr%,dteilbetraghoehe&)}},betrag#,dummy#)
  7661.       einsetz$="Der Auftrag/Antrag wird nur wegen eines Teilbetrages von DM "+@dez_komma$(betrag#,0,2,TRUE)+" gestellt."+CHR$(13)+CHR$(10)
  7662.     ELSE  ! Teilvollstreckung gerade deselektiert
  7663.       einsetz$=""
  7664.     ENDIF
  7665.     '
  7666.     '
  7667.     ' ++++++++++++++++++++++++++++++++++++++++
  7668.     ' MAHNBESCHEIDSDATEN (ohne Computer-MB)
  7669.     ' +++++++++++++++++++++++++++++++++++
  7670.   ELSE IF LEFT$(key$,2)="mb"  ! spart zeit
  7671.     IF key$="mb_mahngericht"
  7672.       einsetz$=mb_mahngericht$
  7673.     ELSE IF key$="mb_ag1"
  7674.       einsetz$=mb_ag1$
  7675.     ELSE IF key$="mb_ag2"
  7676.       einsetz$=mb_ag2$
  7677.     ELSE IF key$="mb_ag3"
  7678.       einsetz$=mb_ag3$
  7679.     ELSE IF key$="mb_ag4"
  7680.       einsetz$=mb_ag4$
  7681.     ELSE IF key$="mb_ag5"
  7682.       einsetz$=mb_ag5$
  7683.     ELSE IF key$="mb_ag6"
  7684.       einsetz$=mb_ag6$
  7685.     ELSE IF key$="mb_ag7"
  7686.       einsetz$=mb_ag7$
  7687.     ELSE IF key$="mb_ag8"
  7688.       einsetz$=mb_ag8$
  7689.     ELSE IF key$="mb_art"
  7690.       einsetz$=mb_art$
  7691.     ELSE IF key$="mb_as1"
  7692.       einsetz$=mb_as1$
  7693.     ELSE IF key$="mb_as2"
  7694.       einsetz$=mb_as2$
  7695.     ELSE IF key$="mb_as3"
  7696.       einsetz$=mb_as3$
  7697.     ELSE IF key$="mb_as4"
  7698.       einsetz$=mb_as4$
  7699.     ELSE IF key$="mb_as5"
  7700.       einsetz$=mb_as5$
  7701.     ELSE IF key$="mb_gesamtschuldner1"
  7702.       einsetz$=mb_gesamtschuldner1$
  7703.     ELSE IF key$="mb_gesamtschuldner2"
  7704.       einsetz$=mb_gesamtschuldner2$
  7705.     ELSE IF key$="mb_gesamtschuldnerschaft"
  7706.       einsetz$=mb_gesamtschuldnerschaft$
  7707.     ELSE IF key$="mb_az"
  7708.       einsetz$=mb_az$
  7709.     ELSE IF key$="mb_anspruch1"
  7710.       einsetz$=mb_anspruch1$
  7711.     ELSE IF key$="mb_anspruch2"
  7712.       einsetz$=mb_anspruch2$
  7713.     ELSE IF key$="mb_anspruch3"
  7714.       einsetz$=mb_anspruch3$
  7715.     ELSE IF key$="mb_anspruch4"
  7716.       einsetz$=mb_anspruch4$
  7717.     ELSE IF key$="mb_anspruch5"
  7718.       einsetz$=mb_anspruch5$
  7719.     ELSE IF key$="mb_zins"
  7720.       einsetz$=mb_zins$
  7721.     ELSE IF key$="mb_zins1"
  7722.       einsetz$=mb_zins1$
  7723.     ELSE IF key$="mb_zins2"
  7724.       einsetz$=mb_zins2$
  7725.     ELSE IF key$="mb_zinsdat"
  7726.       einsetz$=mb_zinsdat$
  7727.     ELSE IF key$="mb_hf"
  7728.       einsetz$=LEFT$(mb_hf$,LEN(mb_hf$)-2)+","+RIGHT$(mb_hf$,2)
  7729.     ELSE IF key$="mb_nf"
  7730.       einsetz$=LEFT$(mb_nf$,LEN(mb_nf$)-2)+","+RIGHT$(mb_nf$,2)
  7731.     ELSE IF key$="mb_kst"
  7732.       einsetz$=LEFT$(mb_kst$,LEN(mb_kst$)-2)+","+RIGHT$(mb_kst$,2)
  7733.     ELSE IF key$="mb_gk"
  7734.       einsetz$=LEFT$(mb_gk$,LEN(mb_gk$)-2)+","+RIGHT$(mb_gk$,2)
  7735.     ELSE IF key$="mb_ausl"
  7736.       einsetz$=LEFT$(mb_ausl$,LEN(mb_ausl$)-2)+","+RIGHT$(mb_ausl$,2)
  7737.     ELSE IF key$="mb_geb"
  7738.       einsetz$=LEFT$(mb_geb$,LEN(mb_geb$)-2)+","+RIGHT$(mb_geb$,2)
  7739.     ELSE IF key$="mb_pval"
  7740.       einsetz$=LEFT$(mb_pval$,LEN(mb_pval$)-2)+","+RIGHT$(mb_pval$,2)
  7741.     ELSE IF key$="mb_mwst"
  7742.       einsetz$=LEFT$(mb_mwst$,LEN(mb_mwst$)-2)+","+RIGHT$(mb_mwst$,2)
  7743.     ELSE IF key$="mb_summe"
  7744.       einsetz$=LEFT$(mb_summe$,LEN(mb_summe$)-2)+","+RIGHT$(mb_summe$,2)
  7745.     ELSE IF key$="mb_ggl-"
  7746.       IF mb_ggl1$="X"
  7747.         einsetz$=mb_ggl1$
  7748.       ELSE
  7749.         einsetz$=SPACE$(8)
  7750.       ENDIF
  7751.     ELSE IF key$="mb_ggl+"
  7752.       IF mb_ggl2$="X"
  7753.         einsetz$=mb_ggl2$
  7754.       ELSE
  7755.         einsetz$=SPACE$(8)
  7756.       ENDIF
  7757.     ELSE IF key$="mb_abgabegericht"
  7758.       einsetz$=mb_abgabegericht$
  7759.     ELSE IF key$="mb_ortdatum"
  7760.       einsetz$=mb_ortdatum$
  7761.     ELSE IF key$="mb_pv1"
  7762.       einsetz$=mb_pv1$
  7763.     ELSE IF key$="mb_pv2"
  7764.       einsetz$=mb_pv2$
  7765.     ELSE IF key$="mb_pv3"
  7766.       einsetz$=mb_pv3$
  7767.     ELSE IF key$="mb_pv4"
  7768.       einsetz$=mb_pv4$
  7769.     ELSE IF key$="mb_pv5"
  7770.       einsetz$=mb_pv5$
  7771.     ELSE IF key$="mb_pv6"
  7772.       einsetz$=mb_pv6$
  7773.     ELSE IF key$="mb_pv7"
  7774.       einsetz$=mb_pv7$
  7775.     ELSE IF key$="mb_pv8"
  7776.       einsetz$=mb_pv8$
  7777.     ELSE IF key$="mb_streitverfahren"
  7778.       einsetz$=mb_streitverfahren$
  7779.     ELSE IF key$="mb_vollmacht"
  7780.       einsetz$=mb_vollmacht$
  7781.     ELSE IF key$="mb_vorsteuer"
  7782.       einsetz$=mb_vorsteuer$
  7783.     ELSE IF key$="mb_agzahl"
  7784.       einsetz$=mb_agzahl$
  7785.     ELSE IF key$="mb_aszahl"
  7786.       einsetz$=mb_aszahl$
  7787.     ENDIF
  7788.     '
  7789.     '
  7790.     ' ++++++++++++++++++++++++++++++++++++++++++++++
  7791.     ' VB-DATEN
  7792.     ' ++++++++++++++++++++++++++++++++++++++++++++++++
  7793.   ELSE IF LEFT$(key$,2)="vb"
  7794.     IF key$="vb_obbetr"
  7795.       einsetz$=vb_obbetr$
  7796.     ELSE IF key$="vb_teilbetrag"
  7797.       einsetz$=vb_teilbetrag$
  7798.     ELSE IF key$="vb_zahlungen"
  7799.       einsetz$=vb_zahlungen$
  7800.     ELSE IF key$="vb_gk"
  7801.       einsetz$=vb_gk$
  7802.     ELSE IF key$="vb_gebuehren"
  7803.       einsetz$=vb_gebuehren$
  7804.     ELSE IF key$="vb_auslagen"
  7805.       einsetz$=vb_auslagen$
  7806.     ELSE IF key$="vb_mwst"
  7807.       einsetz$=vb_mwst$
  7808.     ELSE IF key$="vb_summe"
  7809.       einsetz$=vb_summe$
  7810.     ELSE IF key$="vb_ortdatum"
  7811.       einsetz$=MID$(userort$,INSTR(userort$," "))+","+DATE$
  7812.     ELSE IF key$="vb_zhlg1"
  7813.       einsetz$=vb_zhlg1$
  7814.     ELSE IF key$="vb_zhlg2"
  7815.       einsetz$=vb_zhlg2$
  7816.     ELSE IF key$="vb_gerichtszustellung"
  7817.       einsetz$=vb_gerichtszustellung$
  7818.     ELSE IF key$="vb_parteizustellung"
  7819.       einsetz$=vb_parteizustellung$
  7820.     ENDIF
  7821.     '
  7822.     '
  7823.     '
  7824.     ' ++++++++++++++++++++++++++++++++++++++++
  7825.     ' COMPUTER_MAHNBESCHEIDSDATEN
  7826.     ' +++++++++++++++++++++++++++++++++++
  7827.     ' casv und cagv muß wegen ELSE IF vor ca kommen
  7828.   ELSE IF LEFT$(key$,4)="casv" OR LEFT$(key$,4)="cagv" ! spart Zeit
  7829.     ' --- Antragsstellervertreter und Antragsgegnervertreterdialog ---
  7830.     IF key$="casvspalte1"
  7831.       einsetz$=@string_verlaengern$(TRUE,3,casvspalte1$)
  7832.     ELSE IF key$="casvauslkz1"
  7833.       einsetz$=@string_verlaengern$(TRUE,3,casvauslkz1$)
  7834.     ELSE IF key$="casvstellung1"
  7835.       einsetz$=@string_verlaengern$(TRUE,35,casvstellung1$)
  7836.     ELSE IF key$="casvvornachname1"
  7837.       einsetz$=@string_verlaengern$(TRUE,35,casvvornachname1$)
  7838.     ELSE IF key$="casvstrasse1"
  7839.       einsetz$=@string_verlaengern$(TRUE,35,casvstrasse1$)
  7840.     ELSE IF key$="casvplz1"
  7841.       einsetz$=@string_verlaengern$(TRUE,5,casvplz1$)
  7842.     ELSE IF key$="casvort1"
  7843.       einsetz$=@string_verlaengern$(TRUE,25,casvort1$)
  7844.       '
  7845.     ELSE IF key$="casvspalte2"
  7846.       einsetz$=@string_verlaengern$(TRUE,3,casvspalte2$)
  7847.     ELSE IF key$="casvauslkz2"
  7848.       einsetz$=@string_verlaengern$(TRUE,3,casvauslkz2$)
  7849.     ELSE IF key$="casvstellung2"
  7850.       einsetz$=@string_verlaengern$(TRUE,35,casvstellung2$)
  7851.     ELSE IF key$="casvvornachname2"
  7852.       einsetz$=@string_verlaengern$(TRUE,35,casvvornachname2$)
  7853.     ELSE IF key$="casvstrasse2"
  7854.       einsetz$=@string_verlaengern$(TRUE,35,casvstrasse2$)
  7855.     ELSE IF key$="casvplz2"
  7856.       einsetz$=@string_verlaengern$(TRUE,5,casvplz2$)
  7857.     ELSE IF key$="casvort2"
  7858.       einsetz$=@string_verlaengern$(TRUE,25,casvort2$)
  7859.       '
  7860.     ELSE IF key$="cagvspalte1"
  7861.       einsetz$=@string_verlaengern$(TRUE,3,cagvspalte1$)
  7862.     ELSE IF key$="cagvstellung1"
  7863.       einsetz$=@string_verlaengern$(TRUE,35,cagvstellung1$)
  7864.     ELSE IF key$="cagvvornachname1"
  7865.       einsetz$=@string_verlaengern$(TRUE,35,cagvvornachname1$)
  7866.     ELSE IF key$="cagvstrasse1"
  7867.       einsetz$=@string_verlaengern$(TRUE,35,cagvstrasse1$)
  7868.     ELSE IF key$="cagvplz1"
  7869.       einsetz$=@string_verlaengern$(TRUE,5,cagvplz1$)
  7870.     ELSE IF key$="cagvort1"
  7871.       einsetz$=@string_verlaengern$(TRUE,29,cagvort1$)
  7872.       '
  7873.     ELSE IF key$="cagvspalte2"
  7874.       einsetz$=@string_verlaengern$(TRUE,3,cagvspalte2$)
  7875.     ELSE IF key$="cagvstellung2"
  7876.       einsetz$=@string_verlaengern$(TRUE,35,cagvstellung2$)
  7877.     ELSE IF key$="cagvvornachname2"
  7878.       einsetz$=@string_verlaengern$(TRUE,35,cagvvornachname2$)
  7879.     ELSE IF key$="cagvstrasse2"
  7880.       einsetz$=@string_verlaengern$(TRUE,35,cagvstrasse2$)
  7881.     ELSE IF key$="cagvplz2"
  7882.       einsetz$=@string_verlaengern$(TRUE,5,cagvplz2$)
  7883.     ELSE IF key$="cagvort2"
  7884.       einsetz$=@string_verlaengern$(TRUE,29,cagvort2$)
  7885.     ENDIF
  7886.     '
  7887.   ELSE IF LEFT$(key$,2)="ca"  ! spart zeit
  7888.     ' --- Antragstellerdialog ---
  7889.     IF key$="caaz"
  7890.       einsetz$=@string_verlaengern$(TRUE,35,caaz$)
  7891.       '
  7892.     ELSE IF key$="caanrede1"
  7893.       einsetz$=caanrede1$
  7894.     ELSE IF key$="caauslkz1"
  7895.       einsetz$=@string_verlaengern$(TRUE,3,caauslkz1$)
  7896.     ELSE IF key$="cavorname1"
  7897.       einsetz$=@string_verlaengern$(TRUE,35,cavorname1$)
  7898.     ELSE IF key$="canachname1"
  7899.       einsetz$=@string_verlaengern$(TRUE,35,canachname1$)
  7900.     ELSE IF key$="castrasse1"
  7901.       einsetz$=@string_verlaengern$(TRUE,35,castrasse1$)
  7902.     ELSE IF key$="caplz1"
  7903.       einsetz$=@string_verlaengern$(TRUE,5,caplz1$)
  7904.     ELSE IF key$="caort1"
  7905.       einsetz$=@string_verlaengern$(TRUE,25,caort1$)
  7906.       '
  7907.     ELSE IF key$="caanrede2"
  7908.       einsetz$=caanrede2$
  7909.     ELSE IF key$="caauslkz2"
  7910.       einsetz$=@string_verlaengern$(TRUE,3,caauslkz2$)
  7911.     ELSE IF key$="cavorname2"
  7912.       einsetz$=@string_verlaengern$(TRUE,35,cavorname2$)
  7913.     ELSE IF key$="canachname2"
  7914.       einsetz$=@string_verlaengern$(TRUE,35,canachname2$)
  7915.     ELSE IF key$="castrasse2"
  7916.       einsetz$=@string_verlaengern$(TRUE,35,castrasse2$)
  7917.     ELSE IF key$="caplz2"
  7918.       einsetz$=@string_verlaengern$(TRUE,5,caplz2$)
  7919.     ELSE IF key$="caort2"
  7920.       einsetz$=@string_verlaengern$(TRUE,25,caort2$)
  7921.       '
  7922.     ELSE IF key$="cafirmenrechtsform"
  7923.       einsetz$=cafirmenrechtsform$
  7924.     ELSE IF key$="casonstigefirma"
  7925.       einsetz$=@string_verlaengern$(TRUE,35,casonstigefirma$)
  7926.     ELSE IF key$="cafirmenname1"
  7927.       einsetz$=@string_verlaengern$(TRUE,65,cafirmenname1$)
  7928.     ELSE IF key$="cafirmenname2"
  7929.       einsetz$=@string_verlaengern$(TRUE,65,cafirmenname2$)
  7930.     ELSE IF key$="cafirmaauslkz"
  7931.       einsetz$=@string_verlaengern$(TRUE,3,cafirmaauslkz$)
  7932.     ELSE IF key$="cafirmenstrasse"
  7933.       einsetz$=@string_verlaengern$(TRUE,35,cafirmenstrasse$)
  7934.     ELSE IF key$="cafirmenplz"
  7935.       einsetz$=@string_verlaengern$(TRUE,5,cafirmenplz$)
  7936.     ELSE IF key$="cafirmenort"
  7937.       einsetz$=@string_verlaengern$(TRUE,25,cafirmenort$)
  7938.     ENDIF
  7939.     '
  7940.     '
  7941.   ELSE IF LEFT$(key$,2)="cg"  ! spart zeit
  7942.     ' --- Antragsgegnerdialog ---
  7943.     IF key$="cggesamtschuld"
  7944.       einsetz$=cggesamtschuld$
  7945.       '
  7946.     ELSE IF key$="cganrede1"
  7947.       einsetz$=cganrede1$
  7948.     ELSE IF key$="cgvorname1"
  7949.       einsetz$=@string_verlaengern$(TRUE,35,cgvorname1$)
  7950.     ELSE IF key$="cgnachname1"
  7951.       einsetz$=@string_verlaengern$(TRUE,35,cgnachname1$)
  7952.     ELSE IF key$="cgstrasse1"
  7953.       einsetz$=@string_verlaengern$(TRUE,35,cgstrasse1$)
  7954.     ELSE IF key$="cgplz1"
  7955.       einsetz$=@string_verlaengern$(TRUE,5,cgplz1$)
  7956.     ELSE IF key$="cgort1"
  7957.       einsetz$=@string_verlaengern$(TRUE,29,cgort1$)
  7958.       '
  7959.     ELSE IF key$="cganrede2"
  7960.       einsetz$=cganrede2$
  7961.     ELSE IF key$="cgvorname2"
  7962.       einsetz$=@string_verlaengern$(TRUE,35,cgvorname2$)
  7963.     ELSE IF key$="cgnachname2"
  7964.       einsetz$=@string_verlaengern$(TRUE,35,cgnachname2$)
  7965.     ELSE IF key$="cgstrasse2"
  7966.       einsetz$=@string_verlaengern$(TRUE,35,cgstrasse2$)
  7967.     ELSE IF key$="cgplz2"
  7968.       einsetz$=@string_verlaengern$(TRUE,5,cgplz2$)
  7969.     ELSE IF key$="cgort2"
  7970.       einsetz$=@string_verlaengern$(TRUE,29,cgort2$)
  7971.       '
  7972.     ELSE IF key$="cgfirmenrechtsform"
  7973.       einsetz$=cgfirmenrechtsform$
  7974.     ELSE IF key$="cgsonstigefirma"
  7975.       einsetz$=@string_verlaengern$(TRUE,35,cgsonstigefirma$)
  7976.     ELSE IF key$="cgfirmenname1"
  7977.       einsetz$=@string_verlaengern$(TRUE,65,cgfirmenname1$)
  7978.     ELSE IF key$="cgfirmenname2"
  7979.       einsetz$=@string_verlaengern$(TRUE,65,cgfirmenname2$)
  7980.     ELSE IF key$="cgfirmenstrasse"
  7981.       einsetz$=@string_verlaengern$(TRUE,35,cgfirmenstrasse$)
  7982.     ELSE IF key$="cgfirmenplz"
  7983.       einsetz$=@string_verlaengern$(TRUE,5,cgfirmenplz$)
  7984.     ELSE IF key$="cgfirmenort"
  7985.       einsetz$=@string_verlaengern$(TRUE,29,cgfirmenort$)
  7986.     ENDIF
  7987.     '
  7988.     '
  7989.     ' --- Prozeßbevollmächtigtendialog ---
  7990.   ELSE IF LEFT$(key$,2)="cp"  ! spart zeit
  7991.     IF key$="cpanrede"
  7992.       einsetz$=cpanrede$
  7993.     ELSE IF key$="cpauslagen"
  7994.       einsetz$=@string_verlaengern$(3,7,cpauslagen$)
  7995.     ELSE IF key$="cpvornachname"
  7996.       einsetz$=@string_verlaengern$(TRUE,65,cpvornachname$)
  7997.     ELSE IF key$="cpauslkz"
  7998.       einsetz$=@string_verlaengern$(TRUE,3,cpauslkz$)
  7999.     ELSE IF key$="cpstrasse"
  8000.       einsetz$=@string_verlaengern$(TRUE,35,cpstrasse$)
  8001.     ELSE IF key$="cpplz"
  8002.       einsetz$=@string_verlaengern$(TRUE,5,cpplz$)
  8003.     ELSE IF key$="cport"
  8004.       einsetz$=@string_verlaengern$(TRUE,25,cport$)
  8005.     ELSE IF key$="cpblz"
  8006.       einsetz$=@string_verlaengern$(TRUE,9,cpblz$)
  8007.     ELSE IF key$="cpkonto"
  8008.       einsetz$=@string_verlaengern$(TRUE,25,cpkonto$)
  8009.     ELSE IF key$="cpbank"
  8010.       einsetz$=@string_verlaengern$(TRUE,35,cpbank$)
  8011.     ENDIF
  8012.     '
  8013.     '
  8014.     '
  8015.     ' --- Forderungseingabedialog ---
  8016.   ELSE IF LEFT$(key$,2)="cf"  ! spart zeit
  8017.     IF key$="cfkatalognr1"
  8018.       einsetz$=@string_verlaengern$(TRUE,4,cfkatalognr1$)
  8019.     ELSE IF key$="cfrechtsgrund1"
  8020.       einsetz$=@string_verlaengern$(TRUE,15,cfrechtsgrund1$)
  8021.     ELSE IF key$="cfrechnungsnr1"
  8022.       einsetz$=@string_verlaengern$(TRUE,15,cfrechnungsnr1$)
  8023.     ELSE IF key$="cfabdatum1"
  8024.       einsetz$=@string_verlaengern$(1,8,cfabdatum1$)
  8025.     ELSE IF key$="cfbisdatum1"
  8026.       einsetz$=@string_verlaengern$(1,8,cfbisdatum1$)
  8027.     ELSE IF key$="cfbetrag1"
  8028.       einsetz$=@string_verlaengern$(2,12,cfbetrag1$)
  8029.       '
  8030.     ELSE IF key$="cfkatalognr2"
  8031.       einsetz$=@string_verlaengern$(TRUE,4,cfkatalognr2$)
  8032.     ELSE IF key$="cfrechtsgrund2"
  8033.       einsetz$=@string_verlaengern$(TRUE,15,cfrechtsgrund2$)
  8034.     ELSE IF key$="cfrechnungsnr2"
  8035.       einsetz$=@string_verlaengern$(TRUE,15,cfrechnungsnr2$)
  8036.     ELSE IF key$="cfabdatum2"
  8037.       einsetz$=@string_verlaengern$(1,8,cfabdatum2$)
  8038.     ELSE IF key$="cfbisdatum2"
  8039.       einsetz$=@string_verlaengern$(1,8,cfbisdatum2$)
  8040.     ELSE IF key$="cfbetrag2"
  8041.       einsetz$=@string_verlaengern$(2,12,cfbetrag2$)
  8042.       '
  8043.     ELSE IF key$="cfkatalognr3"
  8044.       einsetz$=@string_verlaengern$(TRUE,4,cfkatalognr3$)
  8045.     ELSE IF key$="cfrechtsgrund3"
  8046.       einsetz$=@string_verlaengern$(TRUE,15,cfrechtsgrund3$)
  8047.     ELSE IF key$="cfrechnungsnr3"
  8048.       einsetz$=@string_verlaengern$(TRUE,15,cfrechnungsnr3$)
  8049.     ELSE IF key$="cfabdatum3"
  8050.       einsetz$=@string_verlaengern$(1,8,cfabdatum3$)
  8051.     ELSE IF key$="cfbisdatum3"
  8052.       einsetz$=@string_verlaengern$(1,8,cfbisdatum3$)
  8053.     ELSE IF key$="cfbetrag3"
  8054.       einsetz$=@string_verlaengern$(2,12,cfbetrag3$)
  8055.       '
  8056.     ELSE IF key$="cfplz"
  8057.       einsetz$=@string_verlaengern$(TRUE,5,cfplz$)
  8058.     ELSE IF key$="cfort"
  8059.       einsetz$=@string_verlaengern$(TRUE,25,cfort$)
  8060.     ELSE IF key$="cfauslkz"
  8061.       einsetz$=@string_verlaengern$(TRUE,3,cfauslkz$)
  8062.     ELSE IF key$="cfvertragsart"
  8063.       einsetz$=@string_verlaengern$(TRUE,25,cfvertragsart$)
  8064.     ELSE IF key$="cfsonstigeanspr1"
  8065.       einsetz$=@string_verlaengern$(TRUE,65,cfsonstigeanspr1$)
  8066.     ELSE IF key$="cfsonstigeanspr2"
  8067.       einsetz$=@string_verlaengern$(TRUE,54,cfsonstigeanspr2$)
  8068.     ELSE IF key$="cfsonstigebetrag"
  8069.       einsetz$=@string_verlaengern$(2,12,cfsonstigebetrag$)
  8070.       '
  8071.       ' --- Zinsen (noch Forderungseingabedialog) ---
  8072.     ELSE IF key$="cfzinsturnus1"
  8073.       einsetz$=cfzinsturnus1$
  8074.     ELSE IF key$="cfzinshfzeile1"
  8075.       einsetz$=@string_verlaengern$(TRUE,4,cfzinshfzeile1$)
  8076.     ELSE IF key$="cfnormalzins1"
  8077.       einsetz$=@string_verlaengern$(4,6,cfnormalzins1$)
  8078.     ELSE IF key$="cfdiskontzins1"
  8079.       einsetz$=@string_verlaengern$(4,6,cfdiskontzins1$)
  8080.     ELSE IF key$="cfzinsbasis1"
  8081.       einsetz$=@string_verlaengern$(2,12,cfzinsbasis1$)
  8082.     ELSE IF key$="cfzinsstart1"
  8083.       einsetz$=@string_verlaengern$(1,8,cfzinsstart1$)
  8084.     ELSE IF key$="cfzinsende1"
  8085.       einsetz$=@string_verlaengern$(1,8,cfzinsende1$)
  8086.       '
  8087.     ELSE IF key$="cfzinsturnus2"
  8088.       einsetz$=cfzinsturnus2$
  8089.     ELSE IF key$="cfzinshfzeile2"
  8090.       einsetz$=@string_verlaengern$(TRUE,4,cfzinshfzeile2$)
  8091.     ELSE IF key$="cfnormalzins2"
  8092.       einsetz$=@string_verlaengern$(4,6,cfnormalzins2$)
  8093.     ELSE IF key$="cfdiskontzins2"
  8094.       einsetz$=@string_verlaengern$(4,6,cfdiskontzins2$)
  8095.     ELSE IF key$="cfzinsbasis2"
  8096.       einsetz$=@string_verlaengern$(2,12,cfzinsbasis2$)
  8097.     ELSE IF key$="cfzinsstart2"
  8098.       einsetz$=@string_verlaengern$(1,8,cfzinsstart2$)
  8099.     ELSE IF key$="cfzinsende2"
  8100.       einsetz$=@string_verlaengern$(1,8,cfzinsende2$)
  8101.       '
  8102.     ELSE IF key$="cfzinsturnus3"
  8103.       einsetz$=cfzinsturnus3$
  8104.     ELSE IF key$="cfzinshfzeile3"
  8105.       einsetz$=@string_verlaengern$(TRUE,4,cfzinshfzeile3$)
  8106.     ELSE IF key$="cfnormalzins3"
  8107.       einsetz$=@string_verlaengern$(4,6,cfnormalzins3$)
  8108.     ELSE IF key$="cfdiskontzins3"
  8109.       einsetz$=@string_verlaengern$(4,6,cfdiskontzins3$)
  8110.     ELSE IF key$="cfzinsbasis3"
  8111.       einsetz$=@string_verlaengern$(2,12,cfzinsbasis3$)
  8112.     ELSE IF key$="cfzinsstart3"
  8113.       einsetz$=@string_verlaengern$(1,8,cfzinsstart3$)
  8114.     ELSE IF key$="cfzinsende3"
  8115.       einsetz$=@string_verlaengern$(1,8,cfzinsende3$)
  8116.       '
  8117.       ' ausgerechnete Zinsen (noch Forderungseingabedialog)
  8118.     ELSE IF key$="cfausgerzinsab"
  8119.       einsetz$=@string_verlaengern$(1,8,cfausgerzinsab$)
  8120.     ELSE IF key$="cfausgerzinsbis"
  8121.       einsetz$=@string_verlaengern$(1,8,cfausgerzinsbis$)
  8122.     ELSE IF key$="cfausgerzinsbetr"
  8123.       einsetz$=@string_verlaengern$(2,12,cfausgerzinsbetr$)
  8124.       '
  8125.       ' Auslagen
  8126.     ELSE IF key$="cfauslagen"
  8127.       einsetz$=@string_verlaengern$(3,7,cfauslagen$)
  8128.     ELSE IF key$="cfsonstauslagenb"
  8129.       einsetz$=@string_verlaengern$(3,7,cfsonstauslagenb$)
  8130.     ELSE IF key$="cfsonstauslagenn"
  8131.       einsetz$=@string_verlaengern$(TRUE,16,cfsonstauslagenn$)
  8132.     ENDIF
  8133.     '
  8134.     '
  8135.     '
  8136.     ' --- Zusatzeingabedialog ---
  8137.     ' - Erklärungen -
  8138.   ELSE IF LEFT$(key$,2)="cz"  ! spart zeit
  8139.     IF key$="czgglunabhaengig"
  8140.       einsetz$=czgglunabhaengig$
  8141.     ELSE IF key$="czgglabhaengig"
  8142.       einsetz$=czgglabhaengig$
  8143.     ELSE IF key$="czvorsteuerabzug"
  8144.       einsetz$=czvorsteuerabzug$
  8145.     ELSE IF key$="czstreitverfahrn"
  8146.       einsetz$=czstreitverfahrn$
  8147.     ELSE IF key$="czgericht"
  8148.       einsetz$=czgericht$
  8149.     ELSE IF key$="czgerichtplz"
  8150.       einsetz$=@string_verlaengern$(TRUE,5,czgerichtplz$)
  8151.     ELSE IF key$="czgerichtort"
  8152.       einsetz$=@string_verlaengern$(TRUE,25,czgerichtort$)
  8153.     ELSE IF key$="czmahngerichtplz"
  8154.       einsetz$=@string_verlaengern$(TRUE,5,czmahngerichtplz$)
  8155.     ELSE IF key$="czmahngerichtort"
  8156.       einsetz$=@string_verlaengern$(TRUE,29,czmahngerichtort$)
  8157.       ' - Nebenkosten -
  8158.     ELSE IF key$="czmahnkosten"
  8159.       einsetz$=@string_verlaengern$(3,7,czmahnkosten$)
  8160.     ELSE IF key$="czauskuenfte"
  8161.       einsetz$=@string_verlaengern$(3,7,czauskuenfte$)
  8162.     ELSE IF key$="czbankruecklast"
  8163.       einsetz$=@string_verlaengern$(3,7,czbankruecklast$)
  8164.     ELSE IF key$="czinkassokosten"
  8165.       einsetz$=@string_verlaengern$(3,7,czinkassokosten$)
  8166.     ELSE IF key$="czsonstnfdgbetr"
  8167.       einsetz$=@string_verlaengern$(3,7,czsonstnfdgbetr$)
  8168.     ELSE IF key$="czsonstnfdgname"
  8169.       einsetz$=@string_verlaengern$(TRUE,25,czsonstnfdgname$)
  8170.       '
  8171.       ' - Abtretung -
  8172.     ELSE IF key$="czaltglaeubiger"
  8173.       einsetz$=@string_verlaengern$(TRUE,35,czaltglaeubiger$)
  8174.     ELSE IF key$="czabtretungdatum"
  8175.       einsetz$=@string_verlaengern$(1,8,czabtretungdatum$)
  8176.     ELSE IF key$="czplz"
  8177.       einsetz$=@string_verlaengern$(TRUE,5,czplz$)
  8178.     ELSE IF key$="czort"
  8179.       einsetz$=@string_verlaengern$(TRUE,25,czort$)
  8180.     ELSE IF key$="czauslkz"
  8181.       einsetz$=@string_verlaengern$(TRUE,3,czauslkz$)
  8182.       '
  8183.       ' - Verbraucherkredit -
  8184.     ELSE IF key$="czhfzeile1"
  8185.       einsetz$=@string_verlaengern$(TRUE,3,czhfzeile1$)
  8186.     ELSE IF key$="czvertragsdatum1"
  8187.       einsetz$=@string_verlaengern$(1,8,czvertragsdatum1$)
  8188.     ELSE IF key$="czeffektivzins1"
  8189.       einsetz$=@string_verlaengern$(4,6,czeffektivzins1$)
  8190.     ELSE IF key$="czhfzeile2"
  8191.       einsetz$=@string_verlaengern$(TRUE,3,czhfzeile2$)
  8192.     ELSE IF key$="czvertragsdatum2"
  8193.       einsetz$=@string_verlaengern$(1,8,czvertragsdatum2$)
  8194.     ELSE IF key$="czeffektivzins2"
  8195.       einsetz$=@string_verlaengern$(4,6,czeffektivzins2$)
  8196.     ELSE IF key$="czhfzeile3"
  8197.       einsetz$=@string_verlaengern$(TRUE,3,czhfzeile3$)
  8198.     ELSE IF key$="czvertragsdatum3"
  8199.       einsetz$=@string_verlaengern$(1,8,czvertragsdatum3$)
  8200.     ELSE IF key$="czeffektivzins3"
  8201.       einsetz$=@string_verlaengern$(4,6,czeffektivzins3$)
  8202.     ENDIF
  8203.   ELSE
  8204.     einsetz$="<< unbekanntes Schlüsselwort >>"
  8205.   ENDIF
  8206.   '
  8207.   '
  8208.   '
  8209.   ' ++++++++++++++++++++++++++++++++++++++++++++++
  8210.   ' STEUERZEICHEN
  8211.   ' +++++++++++++++++++++++++++++++++++++++++++++++
  8212.   IF mitstz%=FALSE AND einsetz$<>"<< unbekanntes Schlüsselwort >>" ! Auswertung ohne Steuerzeichen >> Überspringen
  8213.     ' Wenn <> unbek. Schlüsselwort, dann schon eins gefunden also Suche beenden
  8214.     GOTO steuerzeichenende
  8215.   ELSE ! weitersuchen
  8216.     IF key$="formfeed"
  8217.       einsetz$=formfeed$
  8218.     ELSE IF key$="initialisierung"
  8219.       einsetz$=initialisierung$
  8220.       ' +++ Schriftattribute +++
  8221.     ELSE IF key$="fett+"
  8222.       einsetz$=fettein$
  8223.     ELSE IF key$="fett-"
  8224.       einsetz$=fettaus$
  8225.     ELSE IF key$="underline+"
  8226.       einsetz$=underlineein$
  8227.     ELSE IF key$="underline-"
  8228.       einsetz$=underlineaus$
  8229.       ' +++Schriftgröße +++
  8230.     ELSE IF key$="10cpi"
  8231.       einsetz$=CHR$(253)+CHR$(0)+cpi10$ ! 253,0 damit cpizahl für Zeilenumbruch stimmt
  8232.       ' ist also internes Steuerzeichen
  8233.     ELSE IF key$="12cpi"
  8234.       einsetz$=CHR$(253)+CHR$(1)+cpi12$  ! 253,1 damit cpizahl für Zeilenumbruch stimmt
  8235.     ELSE IF key$="15cpi"
  8236.       einsetz$=CHR$(253)+CHR$(2)+cpi15$  ! 253,2 damit cpizahl für Zeilenumbruch stimmt
  8237.     ENDIF
  8238.     IF mitstz%=FALSE AND einsetz$<>"<< unbekanntes Schlüsselwort >>" ! Auswertung ohne Steuerzeichen >> Überspringen
  8239.       ' also ein Steuerzeichen gefunden >> kein unbek. Schlüsselwort, aber
  8240.       ' Steuerzeuchen löschen, da mitstz%=false
  8241.       einsetz$=""
  8242.     ENDIF
  8243.     IF einsetz$="<< unbekanntes Schlüsselwort >>" ! Fehlermeldung generieren
  8244.       ~@rsc_alert(1,"Unbekanntes Schlüsselwort|'"+key$+"'|Bitte Textmuster prüfen."," [OK ",1)
  8245.     ENDIF
  8246.   ENDIF
  8247. steuerzeichenende:
  8248. RETURN
  8249. ' **********************************************************
  8250. > FUNCTION string_verlaengern$(orientierung%,gesamtlaenge%,variable$)
  8251.   IF orientierung%=TRUE  ! linksbündig
  8252.     a$=variable$+SPACE$(MAX(gesamtlaenge%-LEN(variable$),0))
  8253.   ELSE IF orientierung%=FALSE  ! rechtsbündig
  8254.     a$=SPACE$(gesamtlaenge%-LEN(variable$))+variable$
  8255.   ELSE IF orientierung%=1  ! Datum aus Dialogbox (ohne Punkte, aber Festlänge 8)
  8256.     IF LEN(variable$)=6
  8257.       a$=LEFT$(variable$,2)+"."+MID$(variable$,3,2)+"."+RIGHT$(variable$,2)
  8258.     ENDIF
  8259.   ELSE IF orientierung%=2  ! Betrag aus der Dialogbox ohne Kommapunkt mit 9 Vor- und 2 Nachkommastellen
  8260.     @zahlenumwandlung(9,variable$,betrag#,dummy#)
  8261.     a$=STR$(betrag#,12,2)
  8262.   ELSE IF orientierung%=3  ! Betrag aus der Dialogbox ohne Kommapunkt mit 4 Vor- und 2 Nachkommastellen
  8263.     @zahlenumwandlung(4,variable$,betrag#,dummy#)
  8264.     a$=STR$(betrag#,7,2)
  8265.   ELSE IF orientierung%=4  ! Betrag aus der Dialogbox ohne Kommapunkt mit 2 Vor- und 4 Nachkommastellen
  8266.     @zahlenumwandlung(2,variable$,betrag#,dummy#)
  8267.     a$=STR$(betrag#,6,3)
  8268.   ENDIF
  8269.   RETURN a$
  8270. ENDFUNC
  8271. ' **********************************************************
  8272. > PROCEDURE forderungsstring(mitstz%,VAR a$)
  8273.   IF mitstz%=TRUE
  8274.     a$=CHR$(253)+CHR$(5)  ! internes Steuerzeichen Schaltet Umbruch aus
  8275.   ELSE
  8276.     a$=""
  8277.   ENDIF
  8278.   ' +++ ÜBERSCHRIFT +++
  8279.   a$=a$+" NR.  DATUM     HAUPTFDG    KOSTEN    ZINSEN  K-ZINS ANMERKUNGEN"+CHR$(13)+CHR$(10)
  8280.   '
  8281.   ' +++ Buchungszeilen +++
  8282.   GOSUB freiezeilefinden(1,freiezeile%)
  8283.   FOR j%=1 TO freiezeile%-1
  8284.     IF mitstz%=TRUE  ! nur dann mit Steuerzeichen
  8285.       IF fdgart#(j%+1)=20 OR fdgart#(j%+1)=25 OR fdgart#(j%+1)=22 ! Summe,Restsumme,Endsumme
  8286.         a$=a$+underlineein$
  8287.       ELSE IF fdgart#(j%)=25  ! Endsumme
  8288.         a$=a$+fettein$
  8289.       ENDIF
  8290.     ENDIF
  8291.     a$=a$+fdgtxt$(j%)
  8292.     IF mitstz%=TRUE  ! nur dann mit Steuerzeichen
  8293.       IF fdgart#(j%+1)=20 OR fdgart#(j%+1)=25 OR fdgart#(j%+1)=22 ! Summe, Restsumme,Endsumme
  8294.         a$=a$+underlineaus$
  8295.       ELSE IF fdgart#(j%)=25
  8296.         a$=a$+fettaus$
  8297.       ENDIF
  8298.     ENDIF
  8299.     a$=a$+CHR$(13)+CHR$(10)
  8300.   NEXT j%
  8301.   IF mitstz%=TRUE
  8302.     a$=a$+CHR$(253)+CHR$(6)  ! internes Steuerzeichen schaltet Umbruch ein
  8303.   ENDIF
  8304.   '
  8305. RETURN
  8306. ' **********************************************************
  8307. > PROCEDURE gebuehren_berechnen_und_buchen
  8308.   ' +++++ GEBÜHREN BERECHNEN UND DAZUSETZEN +++
  8309.   ' MUSS VOR ERSTELLEN DES AUSGABESTRINGS KOMMEN, DA DIE GEBÜHREN IN DIE
  8310.   ' FORDERUNGSBERECHNUNG MIT EINFLIESSEN UND DIE GEBÜHRENBERECHNUNG ERSTELLT
  8311.   ' WERDEN MUSS
  8312.   '
  8313.   ' +++++++++++++++++++++++
  8314.   ' ERMITTLUNG DES STREITWERTS (VOR GEBÜHRENZUSATZ)
  8315.   FOR a%=1 TO freiezeile%
  8316.     IF fdgart#(a%)=25  ! ALSO die ENDERGEBNISZEILE
  8317.       streitwert#=zinsdatum%(a%)/100  ! Hier steht das Endergebnis
  8318.       SELECT wasdrucken%  ! EV-ANTRÄGE >>> NUR DEN HÖCHSTGESCHÄFTSWERT NEHMEN
  8319.       CASE 4,16,17
  8320.         streitwert#=MIN(streitwert#,ev_hoechstwert#)  ! HÖCHSTGESCHÄFTSWERT BEI EV-ANTRAG VGL. VOREINSTELLUNGEN
  8321.       ENDSELECT
  8322.       '
  8323.       IF @selected(druckoptbaum_adr%,dteilvollstrckg&)  ! nur aus Teilbetrag
  8324.         @zahlenumwandlung(10,CHAR{{OB_SPEC(druckoptbaum_adr%,dteilbetraghoehe&)}},teilbetrag#,dummy#)
  8325.         streitwert#=MIN(streitwert#,teilbetrag#)
  8326.       ENDIF
  8327.     ENDIF
  8328.   NEXT a%
  8329.   ' +++ GEBÜHRENSÄTZE ERMITTELN
  8330.   ' ERMITTLUNG DER ZWANGSVOLLSTRECKUNGSGEBÜHREN (STREITWERT=GLOBALVARIABLE)
  8331.   GOSUB gebuehrenermittlung(streitwert#,ostwestfaktor#,zvgeb#,halbgeb#,dummy#,verglgeb#,dummy#)
  8332.   ' 3/10 Erhöhung für jeden weiteren Mandanten, maximal 20/10 der Hauptgebühr
  8333.   ' Erhöhungsgebühren nach § 6 BRAGO berechnen
  8334.   SELECT wasdrucken%
  8335.   CASE 2,3,4,5,7,11,13,14,28  ! Alles mit 3/10, evtl auch *.MSB-Drucke
  8336.     erhoehung#=zvgeb#*MIN((mb_aszahl%-1)*0.3,2)
  8337.   CASE 12  !Ratenvergleich
  8338.     erhoehung#=(verglgeb#+halbgeb#)*MIN((mb_aszahl%-1)*0.3,2)
  8339.   DEFAULT
  8340.     erhoehung#=MIN(2*verglgeb#,(mb_aszahl%-1)*zvgeb#)
  8341.   ENDSELECT
  8342.   zvgeb#=MAX(20,zvgeb#)  ! Mindestgebühr 20.- DM
  8343.   zvausl#=ROUND((zvgeb#+erhoehung#)*0.15+0.049,1)
  8344.   zvausl#=MIN(zvausl#,40)  ! Höchstens DM 40.-
  8345.   zvsteuer#=mitmwst%*(ROUND((zvgeb#+zvausl#+erhoehung#)*mwstsatz#/100,2))
  8346.   verglausl#=ROUND((verglgeb#+halbgeb#+erhoehung#)*0.15+0.049,1)
  8347.   verglausl#=MIN(verglausl#,40)  ! Höchstens DM 40.-
  8348.   verglsteuer#=mitmwst%*(ROUND((verglgeb#+halbgeb#+verglausl#+erhoehung#)*mwstsatz#/100,2))
  8349.   '
  8350.   ' +++ GEBÜHREN FÜR ZV-TÄTIGKEIT DAZUSETZEN +++
  8351.   SELECT wasdrucken%
  8352.   CASE 1,6 TO 8,15,16
  8353.     ' KEINE GEBÜHREN BEI 367-AUFSTELLUNG,
  8354.     ' KEINE GEBÜHREN BEI DURCHSUCHUNG, ZAHLUNGSVERBOT UND DRITTSCHULDNERMAHNUNG
  8355.   CASE 3  ! PFÜB >>> jedenfalls Gerichtskosten
  8356.     GOSUB kosten_dazusetzen(6,(zvgeb#+zvausl#+erhoehung#+zvsteuer#)*mitgeb%+gkpfueb#,dummy$)
  8357.   CASE 4,17 ! EV-ANTRAG, Neuer EV-Antrag
  8358.     GOSUB kosten_dazusetzen(7,(zvgeb#+zvausl#+erhoehung#+zvsteuer#)*mitgeb%+gkev#,dummy$)
  8359.   CASE 2,5  ! ZVA, PF+VERH, LÄUFT ALLES ALS ZVA !!!
  8360.     IF mitgeb%=1  ! NUR EINMAL DIE GEBÜHREN ÜBERNEHMEN DAHER VOR DER DRUCKSCHLEIFE
  8361.       GOSUB kosten_dazusetzen(5,(zvgeb#+zvausl#+erhoehung#+zvsteuer#)*mitgeb%,dummy$)
  8362.     ENDIF
  8363.   CASE 9
  8364.     ' POSTANFRAGE
  8365.     GOSUB kosten_dazusetzen(10,gebpanfr#,dummy$)
  8366.   CASE 10
  8367.     GOSUB kosten_dazusetzen(9,gebema#,dummy$)
  8368.   CASE 11
  8369.     ' ZV-Androhung
  8370.     IF mitgeb%=1
  8371.       GOSUB kosten_dazusetzen(14,(zvgeb#+zvausl#+erhoehung#+zvsteuer#)*mitgeb%,"ZV-Drohung")
  8372.     ENDIF
  8373.   CASE 12
  8374.     ' RATENVERGLEICH
  8375.     IF mitgeb%=1
  8376.       GOSUB kosten_dazusetzen(14,verglgeb#+halbgeb#+verglausl#+erhoehung#+verglsteuer#,"Ratenvergleich")
  8377.     ENDIF
  8378.   CASE 13  ! SiHyp
  8379.     IF mitgeb%=1  ! NUR EINMAL DIE GEBÜHREN ÜBERNEHMEN DAHER VOR DER DRUCKSCHLEIFE
  8380.       GOSUB kosten_dazusetzen(14,(zvgeb#+zvausl#+erhoehung#+zvsteuer#)*mitgeb%,"Sicherungshypothek")
  8381.     ENDIF
  8382.   CASE 14  ! Sivstr.
  8383.     IF mitgeb%=1  ! NUR EINMAL DIE GEBÜHREN ÜBERNEHMEN DAHER VOR DER DRUCKSCHLEIFE
  8384.       GOSUB kosten_dazusetzen(14,(zvgeb#+zvausl#+erhoehung#+zvsteuer#)*mitgeb%,"Sicherungsvollstreckung")
  8385.     ENDIF
  8386.   CASE 28  ! Texte aus Musterbibliothek *.MSB
  8387.     ' Gebühren dazusetzen, wenn angewählt _+_ im Textmuster-String vorhanden
  8388.     IF mitgeb%=1 AND INSTR(muster$(28),"{gebuehrenberechnung}")>0
  8389.       GOSUB kosten_dazusetzen(14,(zvgeb#+zvausl#+erhoehung#+zvsteuer#)*mitgeb%,"Schreiben vom "+DATE$)
  8390.     ENDIF
  8391.   ENDSELECT
  8392.   GOSUB neuberechnung(1)
  8393.   GOSUB forderungstextfeld  ! Damit beim Drucken forderungsstring stimmt
  8394. RETURN
  8395. ' ******************************************************************
  8396. > PROCEDURE gebuehrenstring(mitstz%,VAR a$)
  8397.   a$=""
  8398.   ' Nur mit gebühren wenn mitgeb%=1, aber trotzdem drucken, wenn GK berechnet werden
  8399.   IF mitgeb%=1 AND ostwestfaktor#>0 OR wasdrucken%=3 OR wasdrucken%=4 OR wasdrucken%=17
  8400.     ' Vor-Satz nur wenn mit Gebühren
  8401.     a$="Bereits enthalten sind die für dieses Schreiben anfallenden Kosten, die sich wie folgt berechnen:"+CHR$(13)+CHR$(13)
  8402.     IF mitstz%=FALSE   ! Einfach steuerzeichen retten und am Ende restaurieren
  8403.       dummy1$=underlineein$
  8404.       dummy2$=underlineaus$
  8405.       dummy3$=fettein$
  8406.       dummy4$=fettaus$
  8407.       underlineein$=""
  8408.       underlineaus$=""
  8409.       fettein$=""
  8410.       fettaus$=""
  8411.     ELSE
  8412.       a$=a$+CHR$(253)+CHR$(5)  ! internes Steuerzeichen Schaltet Umbruch aus
  8413.     ENDIF
  8414.     SELECT wasdrucken%
  8415.     CASE 2,5,11,13,14,28  ! ZVA,PfVerh,ZV-Drohung,SiHyp,SiVstr (alles ohne GK)
  8416.       ' Auch Ausdrucke aus der Musterbibliothek. Abfrage, ob keyword "gebuehrenstring"
  8417.       ' vorkommt ist überflüssig, da wenn nicht, PROCEDURE keyword ja gar nicht
  8418.       ' hierher verzweigt
  8419.       IF mitgeb%=1 AND ostwestfaktor#>0
  8420.         ' Parameter sind: Zahl, gewünschte Gesamtlänge(rechtsbündiges Einsetzen),
  8421.         ' Nachkommastellen und Tpunkt wenn Tausendertrennpunkte gewünscht sind
  8422.         a$=a$+"Geschäftswert                        DM "+@dez_komma$(streitwert#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8423.         a$=a$+"3/10 Zwangsvollstr.geb., § 57 BRAGO  DM "+@dez_komma$(zvgeb#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8424.         IF mb_aszahl%>1  ! 3/10 Erhöhung für jeden weiteren Mandanten, insg. max. 20/10 Erhöhung
  8425.           a$=a$+"3/10 Erhöhungsgebühr(en), § 6 BRAGO  DM "+@dez_komma$(erhoehung#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8426.         ENDIF
  8427.         a$=a$+underlineein$+"Auslagenpauschale, § 26 II  BRAGO    DM "+@dez_komma$(zvausl#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8428.         IF mitmwst%=0
  8429.           a$=a$+underlineein$
  8430.         ENDIF
  8431.         a$=a$+"Zwischensumme netto                  DM "+@dez_komma$(zvgeb#+erhoehung#+zvausl#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8432.         IF mitmwst%=1
  8433.           a$=a$+underlineein$+@dez_komma$(mwstsatz#,5,2,FALSE)+" % MwSt, § 25 BRAGO             DM "
  8434.           a$=a$+@dez_komma$(zvsteuer#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8435.         ENDIF
  8436.         a$=a$+fettein$+"SUMME                                DM "+@dez_komma$(zvgeb#+erhoehung#+zvausl#+zvsteuer#,11,2,FALSE)
  8437.         a$=a$+fettaus$+CHR$(13)+CHR$(10)
  8438.       ENDIF
  8439.     CASE 3,4,17  ! Pfändungs/Überweisungsbeschluß, EV, EV-Neu (alles mit GK)
  8440.       IF wasdrucken%=3
  8441.         gerichtskosten#=gkpfueb#
  8442.       ELSE
  8443.         gerichtskosten#=gkev#
  8444.       ENDIF
  8445.       IF mitgeb%=1 AND ostwestfaktor#>0
  8446.         a$=a$+"Geschäftswert                        DM "+@dez_komma$(streitwert#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8447.         a$=a$+"3/10 Zwangsvollstr.geb., § 57 BRAGO  DM "+@dez_komma$(zvgeb#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8448.         IF mb_aszahl%>1  ! 3/10 Erhöhung für jeden weiteren Mandanten, insg. max. 20/10 Erhöhung
  8449.           a$=a$+"3/10 Erhöhungsgebühr(en), § 6 BRAGO  DM "+@dez_komma$(erhoehung#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8450.         ENDIF
  8451.         a$=a$+underlineein$+"Auslagenpauschale, § 26 II  BRAGO    DM "+@dez_komma$(zvausl#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8452.         IF mitmwst%=0
  8453.           a$=a$+underlineein$
  8454.         ENDIF
  8455.         a$=a$+"Zwischensumme netto                  DM "+@dez_komma$(zvgeb#+erhoehung#+zvausl#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8456.         IF mitmwst%=1
  8457.           a$=a$+underlineein$+@dez_komma$(mwstsatz#,5,2,FALSE)+" % MwSt, § 25 BRAGO             DM "
  8458.           a$=a$+@dez_komma$(zvsteuer#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8459.         ENDIF
  8460.         a$=a$+"Zwischensumme                        DM "+@dez_komma$(zvgeb#+erhoehung#+zvausl#+zvsteuer#,11,2,FALSE)
  8461.         a$=a$+CHR$(13)+CHR$(10)
  8462.       ENDIF
  8463.       a$=a$+underlineein$+"Gerichtskosten für dieses Verfahren  DM "+@dez_komma$(gerichtskosten#,11,2,FALSE)
  8464.       a$=a$+underlineaus$+CHR$(13)+CHR$(10)+fettein$+"SUMME                                DM "
  8465.       a$=a$+@dez_komma$(gerichtskosten#+mitgeb%*(zvgeb#+erhoehung#+zvausl#+zvsteuer#),11,2,FALSE)+fettaus$+CHR$(13)+CHR$(10)
  8466.     CASE 12  ! RATENVERGLEICH  (ohne GK)
  8467.       IF mitgeb%=1 AND ostwestfaktor#>0
  8468.         a$=a$+"Geschäftswert                        DM "+@dez_komma$(streitwert#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8469.         a$=a$+"15/10 Vergleichsgeb., § 23 BRAGO     DM "+@dez_komma$(verglgeb#+halbgeb#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8470.         IF mb_aszahl%>1  ! 3/10 Erhöhung für jeden weiteren Mandanten, insg. max. 20/10 Erhöhung
  8471.           a$=a$+"3/10 Erhöhungsgebühr(en), § 6 BRAGO  DM "+@dez_komma$(erhoehung#,11,2,FALSE)+CHR$(13)+CHR$(10)
  8472.         ENDIF
  8473.         a$=a$+underlineein$+"Auslagenpauschale, § 26 II  BRAGO    DM "+@dez_komma$(verglausl#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8474.         IF mitmwst%=0
  8475.           a$=a$+underlineein$
  8476.         ENDIF
  8477.         a$=a$+"Zwischensumme netto                  DM "+@dez_komma$(verglgeb#+halbgeb#+erhoehung#+verglausl#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8478.         IF mitmwst%=1
  8479.           a$=a$+underlineein$+@dez_komma$(mwstsatz#,5,2,FALSE)+" % MwSt, § 25 BRAGO             DM "
  8480.           a$=a$+@dez_komma$(verglsteuer#,11,2,FALSE)+underlineaus$+CHR$(13)+CHR$(10)
  8481.         ENDIF
  8482.         a$=a$+fettein$+"Summe                                DM "+@dez_komma$(verglgeb#+halbgeb#+verglausl#+erhoehung#+verglsteuer#,11,2,FALSE)
  8483.         a$=a$+fettaus$+CHR$(13)+CHR$(10)
  8484.       ENDIF
  8485.     ENDSELECT
  8486.     IF mitstz%=FALSE   ! Einfach steuerzeichen retten und am Ende restaurieren
  8487.       underlineein$=dummy1$
  8488.       underlineaus$=dummy2$
  8489.       fettein$=dummy3$
  8490.       fettaus$=dummy4$
  8491.     ELSE
  8492.       a$=a$+CHR$(253)+CHR$(6)  ! internes Steuerzeichen Schaltet Umbruch ein
  8493.     ENDIF
  8494.   ENDIF  ! mitgeb%=1
  8495. RETURN
  8496. ' ******************************************************************
  8497. '
  8498. ' BERECHNUNG DER GEBÜHREN
  8499. '
  8500. ' *******************************************************************
  8501. ' Schon neue Sätze ab 1.7.94
  8502. > PROCEDURE gebuehrenermittlung(sw#,owfakt#,VAR g3_10#,g5_10#,g7_10#,g10_10#,g13_10#)
  8503.   ' owfakt=ostwestfaktor: 1 bei Westgeb, 0.8 bei Ost, 0 bei gar keinen
  8504.   LOCAL g#
  8505.   ' Streitwert muss als Sw übergeben werden
  8506.   IF sw#<=600
  8507.     g#=50
  8508.   ELSE IF sw#<=3000
  8509.     g#=50+(INT((sw#-600.01)/600+1)*40)
  8510.   ELSE IF sw#<=10000
  8511.     g#=210+(INT((sw#-3000.01)/1000+1)*55)
  8512.   ELSE IF sw#<=20000
  8513.     g#=595+(INT((sw#-10000)/2000+1)*70)
  8514.   ELSE IF sw#<=50000
  8515.     g#=945+(INT((sw#-20000)/5000+1)*80)
  8516.   ELSE IF sw#<=100000
  8517.     g#=1425+(INT((sw#-50000)/10000+1)*140)
  8518.   ELSE IF sw#<=400000
  8519.     g#=2125+(INT((sw#-100000)/30000+1)*160)
  8520.   ELSE IF sw#<=1E+06
  8521.     g#=3725+(INT((sw#-400000)/60000+1)*250)
  8522.   ELSE ! also > 1 Mio.
  8523.     g#=6225+(INT((sw#-1E+06)/100000+1)*300)
  8524.   ENDIF
  8525.   g3_10#=ROUND(owfakt#*(0.3*g#+0.049),1)  !(INT(3*g+0.5))/10    ! 3/10 Gebühr AUFRUNDEN AUF 10 PFG
  8526.   '  g3_10=MAX(g3_10,15)        ! Mindestgebühr DM 15
  8527.   g5_10#=ROUND(owfakt#*(g#/2+0.049),1)    !(INT(5*g+0.5))/10    ! 5/10 Gebühr AUFRUNDEN AUF 10 PFG
  8528.   g7_10#=ROUND(owfakt#*(0.75*g#+0.049),1) !(INT(7.5*g+0.5))/10 ! 7.5/10 Gebühr AUFRUNDEN AUF 10 PFG
  8529.   g10_10#=ROUND((g#+0.049)*owfakt#,1)   ! 10/10 Gebühr
  8530.   g13_10#=ROUND(owfakt#*(1.3*g#+0.049),1)   !(INT(13*g+0.5))/10  ! 13/10 Gebühr AUFRUNDEN AUF 10 PFG
  8531. RETURN
  8532. ' ************************************************************
  8533. > PROCEDURE kosten_dazusetzen(forderungsart%,forderungsbetrag#,forderungsname$)
  8534.   aufstellungsaenderung#=TRUE  ! für SPEICHERN ? -Abfrage benötigt
  8535.   GOSUB freiezeilefinden(1,freiezeile%)  ! bei Zeile 1 anfangen
  8536.   GOSUB altergebniszeileloeschen(freiezeile%)
  8537.   GOSUB freiezeilefinden(1,freiezeile%)  ! erneuern des wertes Freiezeile%
  8538.   ' Aktuelles Datum = Buchungsdatum
  8539.   t%=VAL(LEFT$(DATE$,2))
  8540.   m%=VAL(MID$(DATE$,4,2))
  8541.   j%=VAL(RIGHT$(DATE$,2))
  8542.   GOSUB tag_absolut(t%,m%,j%,bdat%)
  8543.   IF fdgdatum%(freiezeile%-1)>bdat%
  8544.     GOSUB nachdatensortieren
  8545.   ENDIF
  8546.   ' ------------
  8547.   IF forderungsbetrag#>0.005  ! wegen evtl. Rechenungenauigkeiten der Sprache
  8548.     betrag#(freiezeile%)=forderungsbetrag#  ! ÜBERGEBENER BETRAG
  8549.     restbetrag#(freiezeile%)=betrag#(freiezeile%)  ! Restbetrag=Betrag
  8550.     zinssatz#(freiezeile%)=0 ! Zinssatz
  8551.     fdgdatum%(freiezeile%)=bdat%  ! Aktuelles Datum
  8552.     ' Fälligkeitsdatum und Zinsdatum sind egal
  8553.     fdgart#(freiezeile%)=forderungsart%  ! ÜBERGEBEN FORDERUNGSART%
  8554.     IF forderungsart%=14
  8555.       fdgname$(freiezeile%)=forderungsname$
  8556.     ENDIF
  8557.   ENDIF
  8558. RETURN
  8559. ' ********************************************************************
  8560. ' Schon neue Werte ab 1.7.94
  8561. > PROCEDURE gerichtskostenermittlung(sw#,VAR gk5_10#,gk10_10#)
  8562.   LOCAL gk#
  8563.   ' Streitwert muss als Sw übergeben werden
  8564.   IF sw#<=600
  8565.     gk#=50
  8566.   ELSE IF sw#<=3000
  8567.     gk#=50+(INT((sw#-600.01)/600+1)*20)
  8568.   ELSE IF sw#<=10000
  8569.     gk#=130+(INT((sw#-3000.01)/1000+1)*15)
  8570.   ELSE IF sw#<=20000
  8571.     gk#=235+(INT((sw#-10000)/2000+1)*30)
  8572.   ELSE IF sw#<=50000
  8573.     gk#=385+(INT((sw#-20000)/5000+1)*45)
  8574.   ELSE IF sw#<=100000
  8575.     gk#=655+(INT((sw#-50000)/10000+1)*60)
  8576.   ELSE IF sw#<=400000
  8577.     gk#=955+(INT((sw#-100000)/30000+1)*200)
  8578.   ELSE IF sw#<=1E+06
  8579.     gk#=2955+(INT((sw#-400000)/60000+1)*295)
  8580.   ELSE ! also > 1 Mio.
  8581.     gk#=5905+(INT((sw#-1E+06)/100000+1)*300)
  8582.   ENDIF
  8583.   gk5_10#=gk#/2                ! 5/10 Gerichtsgebühr kein Aufrunden
  8584.   gk5_10#=MAX(gk5_10#,15)      ! Mindestgebühr DM 15
  8585.   gk10_10#=gk#                 ! 10/10 Gerichtsgebühr
  8586. RETURN
  8587. ' ******************************************************************+
  8588. ' Schon neue Sätze ab 1.7.94
  8589. > PROCEDURE pkh_gebuehrenermittlung(sw#,VAR pkh3_10#,pkh5_10#,pkh75_10#,pkh10_10#,pkh13_10#)  ! Prozeßkostenhilfegebühren
  8590.   LOCAL pkh#
  8591.   ' Streitwert muss als Sw übergeben werden
  8592.   IF sw#<=600
  8593.     pkh#=50
  8594.   ELSE IF sw#<=3000
  8595.     pkh#=50+(INT((sw#-600.01)/600+1)*40)
  8596.   ELSE IF sw#<=6000
  8597.     pkh#=210+(INT((sw#-3000.01)/1000+1)*55)
  8598.   ELSE IF sw#<=10000
  8599.     pkh#=375+(INT((sw#-6000.01)/1000+1)*15)
  8600.   ELSE IF sw#<=20000
  8601.     pkh#=435+(INT((sw#-10000)/2000+1)*10)
  8602.   ELSE IF sw#<=50000
  8603.     pkh#=485+(INT((sw#-20000)/5000+1)*40)
  8604.   ELSE
  8605.     pkh#=765
  8606.   ENDIF
  8607.   '
  8608.   pkh3_10#=(INT(3*pkh#+0.5))/10    ! 3/10 Gebühr AUFRUNDEN AUF 10 PFG
  8609.   pkh3_10#=MAX(pkh3_10#,15)           ! Mindestgebühr DM 15
  8610.   pkh5_10#=(INT(5*pkh#+0.5))/10    ! 5/10 Gebühr AUFRUNDEN AUF 10 PFG
  8611.   pkh75_10#=(INT(7.5*pkh#+0.5))/10 ! 7.5/10 Gebühr AUFRUNDEN AUF 10 PFG
  8612.   pkh10_10#=pkh#                   ! 10/10 Gebühr
  8613.   pkh13_10#=(INT(13*pkh#+0.5))/10  ! 13/10 Gebühr AUFRUNDEN AUF 10 PFG
  8614. RETURN
  8615. ' ***************************************************************
  8616. > PROCEDURE gebuehrenermittlung_alt(sw#,owfakt#,VAR g3_10#,g5_10#,g7_10#,g10_10#,g13_10#)
  8617.   ' owfakt=ostwestfaktor: 1 bei Westgeb, 0.8 bei Ost, 0 bei gar keinen
  8618.   LOCAL g#
  8619.   ' Streitwert muss als Sw übergeben werden
  8620.   IF sw#<=300
  8621.     g#=40
  8622.   ELSE IF sw#<=3000
  8623.     LET g#=40+(INT((sw#-300.01)/300+1)*15)
  8624.   ELSE IF sw#<=10000
  8625.     LET g#=175+(INT((sw#-3000.01)/500+1)*26)
  8626.   ELSE IF sw#<=20000
  8627.     g#=539+(INT((sw#-10000)/1000+1)*31)
  8628.   ELSE IF sw#<=100000
  8629.     g#=849+(INT((sw#-20000)/5000+1)*65)
  8630.   ELSE IF sw#<=400000
  8631.     g#=1889+(INT((sw#-100000)/15000+1)*75)
  8632.   ELSE IF sw#<=1E+06
  8633.     g#=3389+(INT((sw#-400000)/30000+1)*120)
  8634.   ELSE  ! Also > 1 Mio.
  8635.     g#=5789+(INT((sw#-1E+06)/50000+1)*150)
  8636.   ENDIF
  8637.   g3_10#=ROUND(owfakt#*(0.3*g#+0.049),1)  !(INT(3*g+0.5))/10    ! 3/10 Gebühr AUFRUNDEN AUF 10 PFG
  8638.   '  g3_10=MAX(g3_10,15)        ! Mindestgebühr DM 15
  8639.   g5_10#=ROUND(owfakt#*(g#/2+0.049),1)    !(INT(5*g+0.5))/10    ! 5/10 Gebühr AUFRUNDEN AUF 10 PFG
  8640.   g7_10#=ROUND(owfakt#*(0.75*g#+0.049),1) !(INT(7.5*g+0.5))/10 ! 7.5/10 Gebühr AUFRUNDEN AUF 10 PFG
  8641.   g10_10#=ROUND((g#+0.049)*owfakt#,1)   ! 10/10 Gebühr
  8642.   g13_10#=ROUND(owfakt#*(1.3*g#+0.049),1)   !(INT(13*g+0.5))/10  ! 13/10 Gebühr AUFRUNDEN AUF 10 PFG
  8643. RETURN
  8644. ' ************************************************************
  8645. > PROCEDURE gerichtskostenermittlung_alt(sw#,VAR gk5_10#,gk10_10#)
  8646.   LOCAL gk#
  8647.   ' Streitwert muss als Sw übergeben werden
  8648.   IF sw#<=300
  8649.     gk#=15
  8650.   ELSE IF sw#<=3000
  8651.     gk#=15+(INT((sw#-300.01)/300+1)*9)
  8652.   ELSE IF sw#<=10000
  8653.     gk#=96+(INT((sw#-3000.01)/500+1)*9)
  8654.   ELSE IF sw#<=20000
  8655.     gk#=222+(INT((sw#-10000)/1000+1)*12)
  8656.   ELSE IF sw#<=100000
  8657.     gk#=342+(INT((sw#-20000)/5000+1)*36)
  8658.   ELSE IF sw#<=400000
  8659.     gk#=918+(INT((sw#-100000)/15000+1)*90)
  8660.   ELSE IF sw#<=1E+06
  8661.     gk#=2718+(INT((sw#-400000)/30000+1)*180)
  8662.   ELSE  ! Also > 1 Mio.
  8663.     gk#=6318+(INT((sw#-1E+06)/50000+1)*150)
  8664.   ENDIF
  8665.   gk5_10#=gk#/2                ! 5/10 Gerichtsgebühr kein Aufrunden
  8666.   gk5_10#=MAX(gk5_10#,15)      ! Mindestgebühr DM 15
  8667.   gk10_10#=gk#                 ! 10/10 Gerichtsgebühr
  8668. RETURN
  8669. ' ******************************************************************+
  8670. '
  8671. ' ===================================================================
  8672. ' RSC-Prozeduren die nicht über Mydials laufen
  8673. ' ===================================================================
  8674. '
  8675. ' ***********************************************************************
  8676. > PROCEDURE resource_einrichten(nr%)
  8677.   ~RSRC_FREE()                               ! Resource freimachen
  8678.   ' richtet Resource GELDHER1 oder 2 ein (Nr%)
  8679.   IF nr%=1
  8680.     @init_hnumbers_1
  8681.     ~@rsc_laden(boot_pfad$+"\GELDHER1.RSC",-1,popupbaum&,h_menu&,alertbaum&) ! File$,Trees(-1:zählt selbst nach, sonst letzten Dialog einsetzen),Popup,Menu,Alert
  8682.     gc_menutree%=rsc_adr%(h_menu&)  ! Globalvariable Menubaumadresse
  8683.   ELSE
  8684.     @init_hnumbers_2
  8685.     ~@rsc_laden(boot_pfad$+"\GELDHER2.RSC",-1,popupbaum&,h_menu&,alertbaum&) ! File$,Trees(-1:zählt selbst nach, sonst letzten Dialog einsetzen),Popup,Menu,Alert
  8686.     gc_menutree%=rsc_adr%(h_menu&)  ! Globalvariable Menubaumadresse
  8687.   ENDIF
  8688.   SETMOUSE MOUSEX,MAX(MOUSEY,20)
  8689.   ~WIND_UPDATE(1)                            ! BEG_UPDATE
  8690.   ~MENU_BAR(rsc_adr%(h_menu&),1)             ! Menü darstellen
  8691.   ~WIND_UPDATE(0)                            ! END_UPDATE
  8692. RETURN
  8693. ' *****************************************************************************
  8694. > PROCEDURE undo_obj(tree%,obj_index%,maske%)
  8695.   obj_adresse%=tree%+24*obj_index%
  8696.   aus#=DPEEK(obj_adresse%+10)
  8697.   DPOKE obj_adresse%+10,aus# AND NOT maske%
  8698. RETURN
  8699. ' *************************************************************************
  8700. > PROCEDURE do_objc(tree%,obj_index%,bit%)
  8701.   obj_adresse%=tree%+24*obj_index%
  8702.   aus#=DPEEK(obj_adresse%+10)
  8703.   DPOKE obj_adresse%+10,aus# OR bit%
  8704. RETURN
  8705. ' ***************************************************************************
  8706. > PROCEDURE undo_objc(tree%,obj_index%,bit%)
  8707.   obj_adresse%=tree%+24*obj_index%
  8708.   aus#=DPEEK(obj_adresse%+10)
  8709.   DPOKE obj_adresse%+10,aus# AND NOT bit%
  8710. RETURN
  8711. ' *************************************************************************
  8712. > PROCEDURE is_objc(tree%,obj_index%,bit%,aes_return%)
  8713.   obj_adresse%=tree%+24*obj_index%
  8714.   aus#=DPEEK(obj_adresse%+10)
  8715.   *aes_return%=aus# AND bit%
  8716. RETURN
  8717. ' ************************************************************************
  8718. > PROCEDURE set_flag(tree%,obj_index%,bit%)
  8719.   obj_adresse%=tree%+24*obj_index%
  8720.   x#=DPEEK(obj_adresse%+8)
  8721.   DPOKE obj_adresse%+8,x# OR bit%
  8722. RETURN
  8723. ' **************************************************************************
  8724. > PROCEDURE del_flag(tree%,obj_index%,bit%)
  8725.   obj_adresse%=tree%+24*obj_index%
  8726.   x#=DPEEK(obj_adresse%+8)
  8727.   DPOKE obj_adresse%+8,x# AND NOT bit%
  8728. RETURN
  8729. ' ***************************************************************************
  8730. > PROCEDURE is_flag(tree%,obj_index%,bit%,aes_return%)
  8731.   obj_adresse%=tree%+24*obj_index%
  8732.   ret#=DPEEK(obj_adresse%+8)
  8733.   *aes_return%=ret# AND bit%
  8734. RETURN
  8735. ' ************************************************************************+
  8736. > PROCEDURE get_objc_xywh(tree%,obj_index%,VAR px#,py#,width#,height#)
  8737.   ~OBJC_OFFSET(tree%,obj_index%,px#,py#)
  8738.   obj_adresse%=tree%+24*obj_index%
  8739.   width#=DPEEK(obj_adresse%+20)
  8740.   height#=DPEEK(obj_adresse%+22)
  8741. RETURN
  8742. ' ************************************************************************
  8743. > PROCEDURE objc_update(tree%,obj_index%)
  8744.   GOSUB get_objc_xywh(tree%,obj_index%,ax#,ay#,aw#,ah#)
  8745.   ~OBJC_DRAW(tree%,obj_index%,8,ax#,ay#,aw#,ah#)
  8746. RETURN
  8747. ' *********************************************************************
  8748. > PROCEDURE unhide(tree%,obj_index%)
  8749.   GOSUB del_flag(tree%,obj_index%,&H80)  ! unhide
  8750.   GOSUB is_flag(tree%,obj_index%,&H200,*ret#)  ! Merker ?
  8751.   IF ret#<>0 THEN
  8752.     GOSUB set_flag(tree%,obj_index%,8)  ! Editable
  8753.     GOSUB del_flag(tree%,obj_index%,&H200)  !Merker löschen
  8754.   ENDIF
  8755. RETURN
  8756. ' ***************************************************************************
  8757. > PROCEDURE hide(tree%,obj_index%)
  8758.   GOSUB set_flag(tree%,obj_index%,&H80)  ! Hide
  8759.   GOSUB is_flag(tree%,obj_index%,8,*ret#)  ! Editable ?
  8760.   IF ret#<>0 THEN
  8761.     GOSUB set_flag(tree%,obj_index%,&H200)  ! Merker
  8762.     GOSUB del_flag(tree%,obj_index%,8)  ! Editable löschen
  8763.   ENDIF
  8764. RETURN
  8765. ' ***************************************************************************
  8766. > PROCEDURE set_string(tree%,obj_index%,str_txt$)
  8767.   laenge%=LEN(str_txt$)
  8768.   obj_adresse%=tree%+24*obj_index%
  8769.   str_adresse%=LPEEK(obj_adresse%+12)
  8770.   '  WHILE LEN(str_txt$)<>laenge%
  8771.   ' str_txt$=" "+str_txt$
  8772.   ' WEND
  8773.   FOR zj%=0 TO laenge%-1
  8774.     POKE str_adresse%+zj%,ASC(MID$(str_txt$,zj%+1,1))
  8775.   NEXT zj%
  8776. RETURN
  8777. ' ***************************************************************************
  8778. '
  8779. ' =======================================================
  8780. ' ZAHLENUMWANDLUNG BEI LESEN AUS DIALOGBOXEN
  8781. ' ====================================================
  8782. ' *********************************************************
  8783. > PROCEDURE zahlenumwandlung(vorkommastellen%,zahl$,VAR zahlwert#,eintr#)
  8784.   CLR zahlwert#,nachkomma#,eintr#
  8785.   IF LEN(zahl$)>0
  8786.     eintr#=1
  8787.   ENDIF
  8788.   nachkomma$=MID$(zahl$,vorkommastellen%+1)  ! ohne Dezimalpunkt
  8789.   l%=LEN(nachkomma$)
  8790.   FOR i%=1 TO l%
  8791.     nachkomma#=nachkomma#+VAL(MID$(nachkomma$,i%,1))/10^i%
  8792.   NEXT i%
  8793.   zahlwert#=VAL(LEFT$(zahl$,vorkommastellen%))+nachkomma#
  8794. RETURN
  8795. ' ************************************************************
  8796. > PROCEDURE dm_zahlen_einsetzen(tree%,obj%,zahlwert#,laenge%)
  8797.   a$=SPACE$(laenge%-3)+"000"
  8798.   l%=LEN(STR$(INT(100*zahlwert#)))  ! weil Zahlwert in DM
  8799.   CHAR{{OB_SPEC(tree%,obj%)}}=LEFT$(a$,laenge%-l%)+STR$(zahlwert#*100)
  8800. RETURN
  8801. ' ********************************************************++
  8802. '
  8803. ' ==========================================================
  8804. ' ANFANGSBILD
  8805. ' ============================================================
  8806. ' *********************************************************************
  8807. > PROCEDURE anfangsbild_oeffnen
  8808.   ' Optionen müssen eingelesen sein wg. Userdaten
  8809.   ' Fenster muß schon offen sein
  8810.   infobaum_adr%=rsc_adr%(infobaum&)
  8811.   ~RSRC_GADDR(0,infobaum&,infobaum_adr%)
  8812.   ' Verstecken des OK-Knopfes
  8813.   GOSUB set_flag(infobaum_adr%,infook&,128)
  8814.   GOSUB set_flag(infobaum_adr%,abbruc15&,128)
  8815.   ' ++++++++++
  8816.   CHAR{{OB_SPEC(infobaum_adr%,version&)}}=version$
  8817.   CHAR{{OB_SPEC(infobaum_adr%,disknr&)}}=disknr$
  8818.   ' +++++++++
  8819.   ' Voreinstellung USERANREDEFELDER
  8820.   CHAR{{OB_SPEC(infobaum_adr%,user1&)}}=useranrede1$
  8821.   CHAR{{OB_SPEC(infobaum_adr%,user2&)}}=useranrede2$
  8822.   CHAR{{OB_SPEC(infobaum_adr%,userstr&)}}=userstr$
  8823.   CHAR{{OB_SPEC(infobaum_adr%,userort&)}}=userort$
  8824.   CHAR{{OB_SPEC(infobaum_adr%,userkto&)}}=userkto$
  8825.   CHAR{{OB_SPEC(infobaum_adr%,userbank&)}}=userbank$
  8826.   CHAR{{OB_SPEC(infobaum_adr%,userblz&)}}=userblz$
  8827.   @rsc_draw(infobaum&,FALSE)  ! immer als Dialog
  8828. RETURN
  8829. ' *******************************
  8830. > PROCEDURE anfangsbild_schliessen
  8831.   @rsc_back(infobaum&)
  8832.   GOSUB del_flag(infobaum_adr%,infook&,128)
  8833.   GOSUB del_flag(infobaum_adr%,abbruc15&,128)
  8834. RETURN
  8835. ' ***************************************************************************
  8836. '
  8837. ' ===================================================================
  8838. ' ANDERE UNTERPROGRAMME (EIGENE MENÜPUNKTE)
  8839. ' ====================================================================
  8840. ' **************************************************************************
  8841. > PROCEDURE info
  8842.   @resource_einrichten(2)
  8843.   infobaum_adr%=rsc_adr%(infobaum&)
  8844.   @dialog_positionieren(infobaum&)
  8845.   ' ++++++++++
  8846.   CHAR{{OB_SPEC(infobaum_adr%,version&)}}=version$
  8847.   CHAR{{OB_SPEC(infobaum_adr%,disknr&)}}=disknr$
  8848.   ' +++++++++
  8849.   ' Voreinstellung USERANREDEFELDER
  8850.   CHAR{{OB_SPEC(infobaum_adr%,user1&)}}=useranrede1$
  8851.   CHAR{{OB_SPEC(infobaum_adr%,user2&)}}=useranrede2$
  8852.   CHAR{{OB_SPEC(infobaum_adr%,userstr&)}}=userstr$
  8853.   CHAR{{OB_SPEC(infobaum_adr%,userort&)}}=userort$
  8854.   CHAR{{OB_SPEC(infobaum_adr%,userkto&)}}=userkto$
  8855.   CHAR{{OB_SPEC(infobaum_adr%,userbank&)}}=userbank$
  8856.   CHAR{{OB_SPEC(infobaum_adr%,userblz&)}}=userblz$
  8857.   rsc_draw(infobaum&,fensterdial%)
  8858.   ex_obj%=@rsc_do(infobaum&,user1&,dummy&)  ! dummy, da kein Popupmenu in der Box
  8859.   rsc_back(infobaum&)
  8860.   IF ex_obj%=infook&  ! Änderungen auslesen
  8861.     useranrede1$=CHAR{{OB_SPEC(infobaum_adr%,user1&)}}
  8862.     useranrede2$=CHAR{{OB_SPEC(infobaum_adr%,user2&)}}
  8863.     userstr$=CHAR{{OB_SPEC(infobaum_adr%,userstr&)}}
  8864.     userort$=CHAR{{OB_SPEC(infobaum_adr%,userort&)}}
  8865.     userkto$=CHAR{{OB_SPEC(infobaum_adr%,userkto&)}}
  8866.     userbank$=CHAR{{OB_SPEC(infobaum_adr%,userbank&)}}
  8867.     userblz$=CHAR{{OB_SPEC(infobaum_adr%,userblz&)}}
  8868.     optionsaenderung%=TRUE  ! da evtl. Anschrift geändert oder Bankverbindg
  8869.   ENDIF
  8870.   @resource_einrichten(1)
  8871. RETURN
  8872. ' *********************************************************************
  8873. > PROCEDURE voreinstellungen
  8874.   @resource_einrichten(2)
  8875.   altverr#=verrechnungsart#
  8876.   voreinstbaum_adr%=rsc_adr%(voreinstbaum&)
  8877.   @dialog_positionieren(voreinstbaum&)
  8878.   '
  8879.   ' Voreinstellung EINGABEFELDER
  8880.   CHAR{{OB_SPEC(voreinstbaum_adr%,mwstsatz&)}}=STR$(INT(mwstsatz#),2)+STR$(FRAC(mwstsatz#),2,2)
  8881.   CHAR{{OB_SPEC(voreinstbaum_adr%,gebpanfr&)}}=STR$(INT(gebpanfr#),2)+STR$(FRAC(gebpanfr#),2,2)
  8882.   CHAR{{OB_SPEC(voreinstbaum_adr%,gebema&)}}=STR$(INT(gebema#),2)+STR$(FRAC(gebema#),2,2)
  8883.   CHAR{{OB_SPEC(voreinstbaum_adr%,gkpfueb&)}}=STR$(INT(gkpfueb#),2)+STR$(FRAC(gkpfueb#),2,2)
  8884.   CHAR{{OB_SPEC(voreinstbaum_adr%,gkev&)}}=STR$(INT(gkev#),2)+STR$(FRAC(gkev#),2,2)
  8885.   CHAR{{OB_SPEC(voreinstbaum_adr%,gkzust&)}}=STR$(INT(gkzust#),2)+STR$(FRAC(gkzust#),2,2)
  8886.   CHAR{{OB_SPEC(voreinstbaum_adr%,evwert&)}}=STR$(INT(ev_hoechstwert#),5)+STR$(FRAC(ev_hoechstwert#),2,2)
  8887.   '
  8888.   ' VOREINSTELLUNG VERRECHNUNGSARTKNÖPFE
  8889.   IF verrechnungsart#=3
  8890.     @select(voreinstbaum_adr%,verrart1&,FALSE)  ! löschen Verrechnungsart1
  8891.     @select(voreinstbaum_adr%,verrart2&,FALSE)  ! löschen Verrechnungsart2
  8892.     @select(voreinstbaum_adr%,verrart3&,TRUE)  ! setzen Verrechnungsart3
  8893.   ELSE IF verrechnungsart#=2
  8894.     @select(voreinstbaum_adr%,verrart1&,FALSE)  ! löschen Verrechnungsart1
  8895.     @select(voreinstbaum_adr%,verrart2&,TRUE)  ! setzen Verrechnungsart2
  8896.     @select(voreinstbaum_adr%,verrart3&,FALSE)  ! löschen Verrechnungsart3
  8897.   ELSE  ! also 1 oder null, null z.B. bei neuen Dateien möglich
  8898.     @select(voreinstbaum_adr%,verrart1&,TRUE)  ! Vorwahl Verrechnungsart1
  8899.     @select(voreinstbaum_adr%,verrart2&,FALSE)  ! löschen Verrechnungsart2
  8900.     @select(voreinstbaum_adr%,verrart3&,FALSE)  ! löschen Verrechnungsart3
  8901.   ENDIF
  8902.   IF standardverrechnungsart#=3
  8903.     @select(voreinstbaum_adr%,verrart1std&,FALSE)  ! löschen Verrechnungsart1
  8904.     @select(voreinstbaum_adr%,verrart2std&,FALSE)  ! löschen Verrechnungsart1
  8905.     @select(voreinstbaum_adr%,verrart3std&,TRUE)  ! löschen Verrechnungsart3
  8906.   ELSE IF standardverrechnungsart#=2
  8907.     @select(voreinstbaum_adr%,verrart1std&,FALSE)  ! löschen Verrechnungsart1
  8908.     @select(voreinstbaum_adr%,verrart2std&,TRUE)  ! löschen Verrechnungsart1
  8909.     @select(voreinstbaum_adr%,verrart3std&,FALSE)  ! löschen Verrechnungsart3
  8910.   ELSE  ! null oder 1
  8911.     @select(voreinstbaum_adr%,verrart1std&,TRUE)  ! Vorwahl Verrechnungsart1
  8912.     @select(voreinstbaum_adr%,verrart2std&,FALSE)  ! löschen Verrechnungsart2
  8913.     @select(voreinstbaum_adr%,verrart3std&,FALSE)  ! löschen Verrechnungsart3
  8914.   ENDIF
  8915.   '
  8916.   ' Vorbereitung des Dialogs
  8917.   rsc_draw(voreinstbaum&,fensterdial%)
  8918.   '
  8919.   ' Duchführen des Dialogs
  8920.   ex_obj%=@rsc_do(voreinstbaum&,mwstsatz&,dummy&)  ! dummy, da kein Popupmenu in der Box
  8921.   '
  8922.   ' Beenden des Dialogs
  8923.   rsc_back(voreinstbaum&)
  8924.   @select(voreinstbaum_adr%,ex_obj%,FALSE)
  8925.   '
  8926.   IF ex_obj%=fertig19&  ! Veränderungen auslesen
  8927.     mwstsatz$=CHAR{{OB_SPEC(voreinstbaum_adr%,mwstsatz&)}}
  8928.     GOSUB zahlenumwandlung(2,mwstsatz$,mwstsatz#,dummy#)
  8929.     gebpanfr$=CHAR{{OB_SPEC(voreinstbaum_adr%,gebpanfr&)}}
  8930.     GOSUB zahlenumwandlung(2,gebpanfr$,gebpanfr#,dummy#)
  8931.     gebema$=CHAR{{OB_SPEC(voreinstbaum_adr%,gebema&)}}
  8932.     GOSUB zahlenumwandlung(2,gebema$,gebema#,dummy#)
  8933.     gkpfueb$=CHAR{{OB_SPEC(voreinstbaum_adr%,gkpfueb&)}}
  8934.     GOSUB zahlenumwandlung(2,gkpfueb$,gkpfueb#,dummy#)
  8935.     gkev$=CHAR{{OB_SPEC(voreinstbaum_adr%,gkev&)}}
  8936.     GOSUB zahlenumwandlung(2,gkev$,gkev#,dummy#)
  8937.     gkzust$=CHAR{{OB_SPEC(voreinstbaum_adr%,gkzust&)}}
  8938.     GOSUB zahlenumwandlung(2,gkzust$,gkzust#,dummy#)
  8939.     ev_hoechstwert$=CHAR{{OB_SPEC(voreinstbaum_adr%,evwert&)}}
  8940.     GOSUB zahlenumwandlung(5,ev_hoechstwert$,ev_hoechstwert#,dummy#)
  8941.     '
  8942.     ' ABFRAGEN DER VERRECHNUNGSKNÖPFE
  8943.     IF @selected(voreinstbaum_adr%,verrart1&)=TRUE
  8944.       verrechnungsart#=1
  8945.     ELSE IF @selected(voreinstbaum_adr%,verrart2&)=TRUE
  8946.       verrechnungsart#=2
  8947.     ELSE IF @selected(voreinstbaum_adr%,verrart3&)=TRUE
  8948.       verrechnungsart#=3
  8949.     ENDIF
  8950.     IF @selected(voreinstbaum_adr%,verrart1std&)=TRUE
  8951.       standardverrechnungsart#=1
  8952.     ELSE IF @selected(voreinstbaum_adr%,verrart2std&)=TRUE
  8953.       standardverrechnungsart#=2
  8954.     ELSE IF @selected(voreinstbaum_adr%,verrart3std&)=TRUE
  8955.       standardverrechnungsart#=3
  8956.     ENDIF
  8957.     '
  8958.     IF altverr#<>verrechnungsart# ! Also Verrechnungsart geändert
  8959.       aufstellungsaenderung#=TRUE
  8960.       GOSUB neuberechnung(1)
  8961.       GOSUB forderungstextfeld
  8962.       @redraw_part(0,0)
  8963.     ENDIF
  8964.     optionsaenderung%=TRUE  ! da evtl. geändert
  8965.   ENDIF
  8966.   @resource_einrichten(1)
  8967. RETURN
  8968. ' **********************************************************************
  8969. > PROCEDURE datei_loeschen
  8970.   pfad#=GEMDOS(25)+65
  8971.   pfad$=boot_pfad$+"\*.BAK"
  8972.   loeschdateiname$=@fileselect$("Datei löschen",pfad$,"LÖSCHE.DAT")
  8973.   IF loeschdateiname$="" OR RIGHT$(loeschdateiname$)="\"
  8974.     GOTO dateiloeschen_ende
  8975.   ELSE IF EXIST(loeschdateiname$)
  8976.     a$="Achtung !!! Sie löschen|"+loeschdateiname$+""
  8977.     dummy%=@rsc_alert(1,a$,"[OK|[Abbruch",1)
  8978.     IF dummy%=2
  8979.       GOTO dateiloeschen_ende
  8980.     ENDIF
  8981.     KILL loeschdateiname$
  8982.   ENDIF
  8983. dateiloeschen_ende:
  8984. RETURN
  8985. ' *********************************************************************
  8986. > PROCEDURE ordner_anlegen
  8987.   pfad#=GEMDOS(25)+65
  8988.   pfad$=boot_pfad$+"\*.*"
  8989.   ordnername$=@fileselect$("Ordner anlegen",pfad$,"ORDNER.NEU")
  8990.   IF ordnername$="" OR RIGHT$(ordnername$)="\"
  8991.     GOTO ordner_anlegenende
  8992.   ELSE
  8993.     MKDIR ordnername$
  8994.   ENDIF
  8995. ordner_anlegenende:
  8996. RETURN
  8997. ' *********************************************************************
  8998. > PROCEDURE druckertest
  8999.   ' DRUCKER AUF EMPFANGSBEREITSCHAFT TESTEN
  9000. druckertestanfang:
  9001.   dummy%=GEMDOS(17)
  9002.   IF dummy%=0
  9003.     a%=@rsc_alert(1,"Bitte Schalten Sie|Ihren Drucker ein.","[OK|[Abbruch",1)
  9004.     IF a%=2
  9005.       druckabbruch%=1
  9006.       GOTO druckertestende
  9007.     ELSE
  9008.       GOTO druckertestanfang ! Selbstschleife
  9009.     ENDIF
  9010.   ENDIF
  9011.   ' BEGINN DES TESTS
  9012.   GOSUB mausform(9)  ! Kaffeetasse
  9013.   GOSUB initialisierung
  9014.   testzeile%=1
  9015.   FOR i%=1 TO abstand_von_oben%
  9016.     LPRINT SPACE$(abstand_von_links%);"OBERER ABSTAND (WIRD NICHT BEDRUCKT)"
  9017.     INC testzeile%
  9018.   NEXT i%
  9019.   IF abstand_kopf_vom_oberen_druckrand%>0
  9020.     LPRINT SPACE$(abstand_von_links%);"HIER BEGINNT IHR AUSDRUCK BEI SEITEN OHNE ANSCHRIFT"
  9021.     INC testzeile%
  9022.     FOR i%=2 TO abstand_kopf_vom_oberen_druckrand%
  9023.       LPRINT SPACE$(abstand_von_links%);"HIER STEHT TEXT ..."
  9024.       INC testzeile%
  9025.     NEXT i%
  9026.     LPRINT SPACE$(abstand_von_links%);"HIER STEHT DER ADRESSATNAME 1 (NUR BEI SEITEN MIT ANSCHRIFT)"
  9027.     LPRINT SPACE$(abstand_von_links%);"HIER STEHT DER ADRESSATNAME 2 (NUR BEI SEITEN MIT ANSCHRIFT)"
  9028.     LPRINT SPACE$(abstand_von_links%);"HIER STEHT DIE STRASSE DES ADRESSATEN (NUR BEI ANSCHRIFTSEITEN)"
  9029.     LPRINT
  9030.     LPRINT SPACE$(abstand_von_links%);"HIER STEHT PLZ UND ORT DES ADRESSATEN (NUR BEI ANSCHRIFTSEITEN)"
  9031.     ADD testzeile%,5
  9032.   ELSE
  9033.     LPRINT SPACE$(abstand_von_links%);"AUSDRUCKSBEGINN BEI ADRESS- UND FOLGESEITEN (1,ZEILE DER ANSCHRIFT)"
  9034.     LPRINT SPACE$(abstand_von_links%);"HIER STEHT DER ADRESSATNAME 2 (NUR BEI SEITEN MIT ANSCHRIFT)"
  9035.     LPRINT SPACE$(abstand_von_links%);"HIER STEHT DIE STRASSE DES ADRESSATEN (NUR BEI ANSCHRIFTSEITEN)"
  9036.     LPRINT
  9037.     LPRINT SPACE$(abstand_von_links%);"HIER STEHT PLZ UND ORT DES ADRESSATEN (NUR BEI ANSCHRIFTSEITEN)"
  9038.     ADD testzeile%,5
  9039.   ENDIF
  9040.   FOR i%=1 TO (seitenlaenge%-testzeile%-abstand_von_unten%)
  9041.     PAUSE 5
  9042.     SELECT RIGHT$(STR$(i%),1)
  9043.     CASE "1"
  9044.       LPRINT SPACE$(abstand_von_links%);"DIE FOLGENDE ZEILE = DRUCKZEILENBREITE"
  9045.       INC testzeile%
  9046.     CASE "2"  ! ZUR BREITENORIENTIERUNG
  9047.       LPRINT SPACE$(abstand_von_links%);
  9048.       FOR j%=1 TO zeichen_pro_zeile%
  9049.         LPRINT RIGHT$(STR$(j%),1);
  9050.       NEXT j%
  9051.       LPRINT
  9052.       INC testzeile%
  9053.     CASE "3"
  9054.       GOSUB fett(1)
  9055.       LPRINT SPACE$(abstand_von_links%);"DAS IST FETTSCHRIFT - ";
  9056.       GOSUB fett(0)
  9057.       LPRINT "DAS IST NORMALSCHRIFT"
  9058.       INC testzeile%
  9059.     CASE "4"
  9060.       LPRINT SPACE$(abstand_von_links%);
  9061.       GOSUB underline(1)
  9062.       LPRINT "DAS IST UNTERSTRICHENE SCHRIFT";
  9063.       GOSUB underline(0)
  9064.       LPRINT " - DAS IST NORMALSCHRIFT"
  9065.       INC testzeile%
  9066.     CASE "5"
  9067.       GOSUB cpi(10)
  9068.       LPRINT SPACE$(abstand_von_links%);"10 ZEICHEN / INCH - ";
  9069.       GOSUB cpi(12)
  9070.       LPRINT "12 ZEICHEN / INCH"
  9071.       GOSUB cpi(10)
  9072.       INC testzeile%
  9073.     CASE "6"
  9074.       LPRINT SPACE$(abstand_von_links%);"GROSSES AE = ";grossae$;"  GROSSES OE = ";grossoe$;"  GROSSES UE = ";grossue$
  9075.       INC testzeile%
  9076.     CASE "7"
  9077.       LPRINT SPACE$(abstand_von_links%);"KLEINES AE = ";kleinae$;"  KLEINES OE = ";kleinoe$;"  KLEINES UE = ";kleinue$
  9078.       INC testzeile%
  9079.     CASE "8"
  9080.       LPRINT SPACE$(abstand_von_links%);"PARAGRAPH = ";paragraph$;"  SCHARFES S (SZ) = ";sz$
  9081.       INC testzeile%
  9082.     DEFAULT
  9083.       LPRINT SPACE$(abstand_von_links%);"HIER STEHT TEXT ..."
  9084.       INC testzeile%
  9085.     ENDSELECT
  9086.   NEXT i%
  9087.   FOR i%=1 TO abstand_fusszeile%
  9088.     LPRINT SPACE$(abstand_von_links%);"FUSSZEILENABSTAND - WIRD NICHT BEDRUCKT"
  9089.     INC testzeile%
  9090.   NEXT i%
  9091.   LPRINT SPACE$(abstand_von_links%);"HIER STEHT DIE FUSSZEILE MIT SEITENNUMMER"
  9092.   INC testzeile%
  9093.   FOR testzeile%=testzeile% TO seitenlaenge%-1
  9094.     LPRINT  !   testzeile%;". ZEILE"
  9095.   NEXT testzeile%
  9096.   LPRINT SPACE$(abstand_von_links%);"LETZTE ZEILE DES BLATTES; ES FOLGT SEITENVORSCHUB UND NACHSPANN";
  9097.   LPRINT formfeed$;
  9098.   LPRINT nachspann$;
  9099. druckertestende:
  9100.   DEFMOUSE 0
  9101. RETURN
  9102. ' ***********************************************************************
  9103. > PROCEDURE dialogeinstellungen
  9104.   ' dialogpos%: 1=zentriert, 2=mausabhängig, 3=geladen (PRT\DIALOG.POS)
  9105.   ' ACHTUNG: da mit 2 Resourcen gearbeitet wird, ist laden/speichern der Positionen nicht möglich
  9106.   @resource_einrichten(2)
  9107.   dialogboxbaum_adr%=rsc_adr%(dialogboxbaum&)
  9108.   @dialog_positionieren(dialogboxbaum&)
  9109.   @select(dialogboxbaum_adr%,dbzentriert&,FALSE)
  9110.   @select(dialogboxbaum_adr%,dbmausabhaengig&,FALSE)
  9111.   '  @select(dialogboxbaum_adr%,dbausdatei&,FALSE)
  9112.   SELECT dialogpos%
  9113.   CASE 1  !zentriert
  9114.     @select(dialogboxbaum_adr%,dbzentriert&,TRUE)
  9115.   CASE 2  ! mausabhängig
  9116.     @select(dialogboxbaum_adr%,dbmausabhaengig&,TRUE)
  9117.     '  CASE 3  ! gespeichert
  9118.     '    @select(dialogboxbaum_adr%,dbausdatei&,TRUE)
  9119.   ENDSELECT
  9120.   IF BTST(fensterdial%,0) ! Nulltes Bit gesetzt ==> Fensterdialog
  9121.     @select(dialogboxbaum_adr%,dbalsfenster&,TRUE)
  9122.     @select(dialogboxbaum_adr%,dbalsbox&,FALSE)
  9123.   ELSE
  9124.     @select(dialogboxbaum_adr%,dbalsfenster&,FALSE)
  9125.     @select(dialogboxbaum_adr%,dbalsbox&,TRUE)
  9126.   ENDIF
  9127.   '
  9128.   @rsc_draw(dialogboxbaum&,fensterdial%)
  9129.   ex_obj%=@rsc_do(dialogboxbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  9130.   rsc_back(dialogboxbaum&)
  9131.   @select(dialogboxbaum_adr%,ex_obj%,FALSE)
  9132.   '
  9133.   IF ex_obj%=dbok&
  9134.     optionsaenderung%=TRUE
  9135.     IF @selected(dialogboxbaum_adr%,dbzentriert&)=TRUE
  9136.       dialogpos%=1
  9137.     ELSE IF @selected(dialogboxbaum_adr%,dbmausabhaengig&)=TRUE
  9138.       dialogpos%=2
  9139.       '    ELSE IF @selected(dialogboxbaum_adr%,dbausdatei&)=TRUE
  9140.       '      dialogpos%=3
  9141.       '      IF @selected(dialogboxbaum_adr%,dbpossichern&)=TRUE
  9142.       '      GOSUB dialogpositionen_speichern
  9143.       '    ENDIF
  9144.     ENDIF
  9145.     IF @selected(dialogboxbaum_adr%,dbalsfenster&)=TRUE  ! BUTTON in Baum DIALOGBOXBAUM
  9146.       ' TRUE wenn Fensterdialoge gewünscht, sonst FALSE
  9147.       ' Nur nulltes Bit ändern, denn bit 1 (Wert+2)=Schließfeld im Fensterdialog
  9148.       ' und bit 2 (Wert + 4)= sofort zeichnen, nicht erst bei rsc_do-Aufruf
  9149.       fensterdial%=BSET(fensterdial%,0)
  9150.     ELSE
  9151.       fensterdial%=BCLR(fensterdial%,0)
  9152.     ENDIF
  9153.   ENDIF
  9154.   @resource_einrichten(1)
  9155. RETURN
  9156. ' **************************************************************
  9157. > PROCEDURE dialog_positionieren(tree&)
  9158.   tree_adr%=rsc_adr%(tree&)
  9159.   '  IF fensterdial!=FALSE  ! nicht bei Fensterdialogen
  9160.   SELECT dialogpos%  ! global
  9161.   CASE 1  ! Zentriert
  9162.     rscx&(tree&)=OB_X(tree_adr%,0)
  9163.     rscy&(tree&)=OB_Y(tree_adr%,0)
  9164.     rscw&(tree&)=OB_W(tree_adr%,0)
  9165.     rsch&(tree&)=OB_H(tree_adr%,0)
  9166.     ~FORM_CENTER(tree_adr%,rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  9167.   CASE 2  ! mausabhängig
  9168.     ' Werte des Desktop-Arbeitsbereichs holen:
  9169.     ~WIND_GET(0,4,desk_x%,desk_y%,desk_w%,desk_h%)
  9170.     MOUSE x%,y%,k%
  9171.     ' x-Koordinate
  9172.     dummy%=(x%-rscw&(tree&)/2)
  9173.     dummy%=MAX(3,dummy%)  ! mindestens drei wg. äußerem Rand der Box
  9174.     dummy%=MIN(desk_w%-OB_W(tree_adr%,0)-3,dummy%)  ! innerhalb des Bidschirms
  9175.     rscx&(tree&)=INT(dummy%)
  9176.     OB_X(tree_adr%,0)=rscx&(tree&)+3
  9177.     ' y-Koordinate
  9178.     dummy%=y%-OB_H(tree_adr%,0)/2
  9179.     dummy%=MAX(desk_y%+3,dummy%)  ! mindestens 3 unter Menüleiste
  9180.     dummy%=MIN(desk_y%+desk_h%-OB_H(tree_adr%,0)-3,dummy%)  ! innerhalb des Bidschirms
  9181.     rscy&(tree&)=INT(dummy%)
  9182.     OB_Y(tree_adr%,0)=rscy&(tree&)+3
  9183.   CASE 3  ! geladen
  9184.     ' nichts machen, da am Programmanfang geladen und zugewiesen wurde
  9185.   ENDSELECT
  9186.   ' ENDIF
  9187. RETURN
  9188. ' *****************************************************************
  9189. > PROCEDURE funktionstasten
  9190.   @resource_einrichten(2)
  9191.   defkeybaum_adr%=rsc_adr%(defkeybaum&)
  9192.   @dialog_positionieren(defkeybaum&)
  9193.   '
  9194.   ' Vorbereitung des Dialogs
  9195.   rsc_draw(defkeybaum&,fensterdial%)
  9196.   @ftastentext_einsetzen
  9197.   erstes_objekt%=kbelegung&
  9198. nochmal_defkey:
  9199.   '
  9200.   ' Duchführen des Dialogs
  9201.   ex_obj%=@rsc_do(defkeybaum&,erstes_objekt%,dummy&)  ! dummy, da kein Popupmenu in der Box
  9202.   SELECT ex_obj%
  9203.   CASE ktaste&,ktastenpopup&,ktastencycle&
  9204.     @ftastentext_einsetzen
  9205.     GOTO nochmal_defkey
  9206.   CASE kebene&,kebenepopup&,kebenecycle&
  9207.     @ftastentext_einsetzen
  9208.     GOTO nochmal_defkey
  9209.   CASE kok&
  9210.     @welche_ftaste(nr%)
  9211.     ftaste$(nr%)=CHAR{{OB_SPEC(defkeybaum_adr%,kbelegung&)}}
  9212.     KEYDEF (nr%),ftaste$(nr%)
  9213.     optionsaenderung%=TRUE
  9214.   CASE kweiter&
  9215.     @welche_ftaste(nr%)
  9216.     ftaste$(nr%)=CHAR{{OB_SPEC(defkeybaum_adr%,kbelegung&)}}
  9217.     KEYDEF (nr%),ftaste$(nr%)
  9218.     optionsaenderung%=TRUE
  9219.     @select(defkeybaum_adr%,ex_obj%,FALSE)
  9220.     @objc_update(defkeybaum_adr%,ex_obj%)
  9221.     GOTO nochmal_defkey
  9222.   ENDSELECT
  9223.   '
  9224.   ' Formular schließen
  9225.   rsc_back(defkeybaum&)
  9226.   @select(defkeybaum_adr%,ex_obj%,FALSE)
  9227.   @resource_einrichten(1)
  9228. RETURN
  9229. ' ***********************************************************
  9230. > PROCEDURE ftastentext_einsetzen
  9231.   @welche_ftaste(nr%)
  9232.   CHAR{{OB_SPEC(defkeybaum_adr%,kbelegung&)}}=ftaste$(nr%)
  9233.   objc_update(defkeybaum_adr%,kbelegung&)
  9234. RETURN
  9235. ' **************************************************************
  9236. > PROCEDURE welche_ftaste(VAR fnr%)
  9237.   ' Welche F-Taste
  9238.   dummy$=CHAR{{OB_SPEC(defkeybaum_adr%,ktastenpopup&)}}
  9239.   fnr%=VAL(TRIM$(MID$(dummy$,3)))
  9240.   dummy$=CHAR{{OB_SPEC(defkeybaum_adr%,kebenepopup&)}}
  9241.   IF LEFT$(TRIM$(dummy$),1)="S"  ! Shift
  9242.     fnr%=fnr%+10
  9243.   ENDIF
  9244. RETURN
  9245. ' ****************************************************************
  9246. > PROCEDURE f_tasten_aktion(flag%)
  9247.   LOCAL such$,dummy&,box&,titel&,i&,ok!,last_box!
  9248.   such$=ftaste$(flag%)
  9249.   '
  9250.   ' Raussuchen der Menüeinträge
  9251.   '
  9252.   IF such$<>""
  9253.     such$=" "+such$  ! Gesamtsuchstring mit führendem Leerzeichen
  9254.     dummy&=OB_HEAD(gc_menutree%,0)  ! Erstes Kind
  9255.     titel&=OB_HEAD(gc_menutree%,OB_HEAD(gc_menutree%,dummy&))  ! Nr. des ersten Titels
  9256.     box&=OB_HEAD(gc_menutree%,OB_NEXT(gc_menutree%,dummy&))  ! Nr. der ersten Klappbox
  9257.     ok!=FALSE  ! Voreinstellung
  9258.     REPEAT
  9259.       i&=OB_HEAD(gc_menutree%,box&)  ! erster Eintrag
  9260.       REPEAT
  9261.         IF OB_TYPE(gc_menutree%,i&)=28  ! Eintrag ist string
  9262.           ok!=INSTR(CHAR{OB_SPEC(gc_menutree%,i&)},such$)
  9263.         ENDIF
  9264.         IF ok!
  9265.           ' Menütitel invertieren und Menübehandlungsroutine aufrufen
  9266.           IF NOT BTST(OB_STATE(gc_menutree%,i&),3)  ! Eintrag nicht inaktiv
  9267.             IF NOT BTST(OB_STATE(gc_menutree%,titel&),3)  ! Titel auch nicht
  9268.               ~MENU_TNORMAL(gc_menutree%,title&,0)  ! invertieren
  9269.               menu_evaluation(titel&,i&)
  9270.             ENDIF
  9271.           ENDIF
  9272.         ELSE
  9273.           ' prüfen, ob der letzte Eintrag des Titels vorliegt
  9274.           last_i!=(i&=OB_TAIL(gc_menutree%,OB_NEXT(gc_menutree%,i&)))
  9275.           IF NOT last_i!
  9276.             i&=OB_NEXT(gc_menutree%,i&)
  9277.           ENDIF
  9278.         ENDIF
  9279.       UNTIL ok! OR last_i!
  9280.       ' prüfen, obe der letzte Titel durchsucht wurde
  9281.       last_box!=(box&=OB_TAIL(gc_menutree%,OB_NEXT(gc_menutree%,box&)))
  9282.       IF NOT last_box!
  9283.         ' Dann zur nächsten box und dem nächsten Titel
  9284.         box&=OB_NEXT(gc_menutree%,box&)
  9285.         titel&=OB_NEXT(gc_menutree%,titel&)
  9286.       ENDIF
  9287.     UNTIL ok! OR last_box!
  9288.   ENDIF
  9289. RETURN
  9290. ' **********************************************************+
  9291. > PROCEDURE speichereinteilung
  9292.   @resource_einrichten(2)
  9293.   speicherbaum_adr%=rsc_adr%(speicherbaum&)
  9294.   @dialog_positionieren(speicherbaum&)
  9295. speichereinteilung_start:
  9296.   ' +++++++++  VORBELEGUNG der FORMULARFELDER +++++++++++
  9297.   CHAR{{OB_SPEC(speicherbaum_adr%,sebuchungen&)}}=STR$(maximalbuchungen%,4)
  9298.   CHAR{{OB_SPEC(speicherbaum_adr%,sedatensaetze&)}}=STR$(max_adr%,4)
  9299.   ~FRE(0)  ! Garbage Collection
  9300.   dummy$=STR$(FRE()/1024/1024,4)
  9301.   CHAR{{OB_SPEC(speicherbaum_adr%,seprgverfuegbar&)}}=dummy$
  9302.   dummy$=STR$(MALLOC(-1)/1024/1024,4)
  9303.   CHAR{{OB_SPEC(speicherbaum_adr%,sesysverfuegbar&)}}=dummy$
  9304.   '
  9305.   ' Vorbereitung des Dialogs
  9306.   @rsc_draw(speicherbaum&,fensterdial%)
  9307.   '
  9308.   ' Duchführen des Dialogs
  9309.   ex_obj%=@rsc_do(speicherbaum&,sebuchungen&,dummy&)  ! dummy, da kein Popupmenu in der Box
  9310.   '
  9311.   ' Beenden des Dialogs
  9312.   @rsc_back(speicherbaum&)
  9313.   @select(speicherbaum_adr%,ex_obj%,FALSE)
  9314.   IF ex_obj%=seok&  ! Nur dann Änderungen auslesen
  9315.     IF VAL(CHAR{{OB_SPEC(speicherbaum_adr%,sebuchungen&)}})<100 OR VAL(CHAR{{OB_SPEC(speicherbaum_adr%,sedatensaetze&)}})<100
  9316.       dummy%=@rsc_alert(1,"Zu kleiner Wert für|Adressen- oder Daten-|bereiche eingestellt.|Minimum ist 100"," [OK ",1)
  9317.       GOTO speichereinteilung_start
  9318.     ENDIF
  9319.     optionsaenderung%=TRUE
  9320.     maximalbuchungen%=VAL(CHAR{{OB_SPEC(speicherbaum_adr%,sebuchungen&)}})
  9321.     max_adr%=VAL(CHAR{{OB_SPEC(speicherbaum_adr%,sedatensaetze&)}})
  9322.     '
  9323.     adressspeicher%=8*(12+10*(max_adr%+1))+adressdateilaenge%+1*(12+6*(max_adr%+1))
  9324.     forderungsberechnungsspeicher%=2*(12+6*(maximalbuchungen%+1))+8*(12+8*(maximalbuchungen%+1))
  9325.     ADD forderungsberechnungsspeicher%,12+10*(maximalbuchungen%+1)+(maximalbuchungen#+1)*80+(12+10*(maximalbuchungen%+1))  ! forderungstextfeld max ca. 80 Zeichen alng und Forderungsartfeld
  9326.     ' Gesamtspeicherbedarf incl. 50.000 Bytes für sonstiges wie Temporärfelder
  9327.     ' ohne Hintergrundrettung, da die über MALLOC im Systemspeicher läuft
  9328.     gesamtspeicherbedarf%=adressspeicher%+forderungsberechnungsspeicher%+50000
  9329.     IF gesamtspeicherbedarf%>verfuegbarer_speicher%  ! verf. Speicher wie in dimensionierungen2
  9330.       dummy%=@rsc_alert(1,"Zu große Werte für|Adressen- und Daten-|bereiche eingestellt.|Bitte ändern !"," [OK ",1)
  9331.       GOTO speichereinteilung_start
  9332.     ENDIF
  9333.     '
  9334.     ~@rsc_alert(1,"Änderungen werden erst|nach Programmneustart gültig !"," [OK ",1)
  9335.   ENDIF
  9336.   @resource_einrichten(1)
  9337. RETURN
  9338. ' *************************************************************
  9339. > FUNCTION mxalloc_global(amount%)                                  !call
  9340.   IF GEMDOS(48)=>&H1900
  9341.     RETURN GEMDOS(68,L:amount%,&X101010)
  9342.   ENDIF
  9343.   RETURN MALLOC(amount%)
  9344. ENDFUNC
  9345. ' ****************************************************************+
  9346. > PROCEDURE standardadressat
  9347.   @resource_einrichten(2)
  9348.   stdadrbaum_adr%=rsc_adr%(stdadrbaum&)
  9349.   @dialog_positionieren(stdadrbaum&)
  9350.   ' +++++++++  VORBELEGUNG der FORMULARFELDER +++++++++++
  9351.   CHAR{{OB_SPEC(stdadrbaum_adr%,sadname1&)}}=standardadressatanrede1$
  9352.   CHAR{{OB_SPEC(stdadrbaum_adr%,sadname2&)}}=standardadressatanrede2$
  9353.   CHAR{{OB_SPEC(stdadrbaum_adr%,sadstr&)}}=standardadressatstrasse$
  9354.   CHAR{{OB_SPEC(stdadrbaum_adr%,sadort&)}}=standardadressatort$
  9355.   '
  9356.   ' Vorbereitung des Dialogs
  9357.   @rsc_draw(stdadrbaum&,fensterdial%)
  9358.   '
  9359.   ' Duchführen des Dialogs
  9360.   ex_obj%=@rsc_do(stdadrbaum&,sadname&,dummy&)  ! dummy, da kein Popupmenu in der Box
  9361.   '
  9362.   ' Beenden des Dialogs
  9363.   @rsc_back(stdadrbaum&)
  9364.   @select(stdadrbaum_adr%,ex_obj%,FALSE)
  9365.   IF ex_obj%=fertig12&  ! Nur dann Änderungen auslesen
  9366.     optionsaenderung%=TRUE
  9367.     standardadressatanrede1$=CHAR{{OB_SPEC(stdadrbaum_adr%,sadname1&)}}
  9368.     standardadressatanrede2$=CHAR{{OB_SPEC(stdadrbaum_adr%,sadname2&)}}
  9369.     standardadressatstrasse$=CHAR{{OB_SPEC(stdadrbaum_adr%,sadstr&)}}
  9370.     standardadressatort$=CHAR{{OB_SPEC(stdadrbaum_adr%,sadort&)}}
  9371.   ENDIF
  9372.   @resource_einrichten(1)
  9373. RETURN
  9374. ' *************************************************************
  9375. > PROCEDURE formular
  9376.   @resource_einrichten(2)
  9377.   formularbaum_adr%=rsc_adr%(formularbaum&)
  9378.   @dialog_positionieren(formularbaum&)
  9379.   FOR i%=snrlinks& TO snrrechts&
  9380.     @select(formularbaum_adr%,i%,FALSE) ! erst deselektieren
  9381.   NEXT i%
  9382.   ' dann richtiges selektieren
  9383.   ' seitennrjustierung%: 0=links, 1=Mitte, 2=rechts
  9384.   @select(formularbaum_adr%,snrlinks&+seitennrjustierung%,TRUE)
  9385.   '
  9386.   CHAR{{OB_SPEC(formularbaum_adr%,unterschrift&)}}=unterschriftsleiste$
  9387.   ' +++++++++  VORBELEGUNG der FORMULARFELDER +++++++++++
  9388.   IF MID$(CHAR{{OB_SPEC(formularbaum_adr%,fpopup&)}},3,1)="V" ! Vollstreckungen
  9389.     CHAR{{OB_SPEC(formularbaum_adr%,flrand&)}}=STR$(abstand_von_links%,2)
  9390.     CHAR{{OB_SPEC(formularbaum_adr%,furandfz&)}}=STR$(abstand_fusszeile%,2)
  9391.     CHAR{{OB_SPEC(formularbaum_adr%,fbreite&)}}=STR$(zeichen_pro_zeile%,2)
  9392.     CHAR{{OB_SPEC(formularbaum_adr%,furand&)}}=STR$(abstand_von_unten%,2)
  9393.     CHAR{{OB_SPEC(formularbaum_adr%,forandad&)}}=STR$(abstand_kopf_vom_oberen_druckrand%,2)
  9394.     CHAR{{OB_SPEC(formularbaum_adr%,flaenge&)}}=STR$(seitenlaenge%,3)
  9395.     CHAR{{OB_SPEC(formularbaum_adr%,forand&)}}=STR$(abstand_von_oben%,2)
  9396.   ELSE IF MID$(CHAR{{OB_SPEC(formularbaum_adr%,fpopup&)}},3,1)="M" ! Mahnbescheide
  9397.     CHAR{{OB_SPEC(formularbaum_adr%,flrand&)}}=STR$(mb_abstand_von_links%,2)
  9398.     CHAR{{OB_SPEC(formularbaum_adr%,flaenge&)}}=STR$(mb_seitenlaenge%,3)
  9399.     CHAR{{OB_SPEC(formularbaum_adr%,forand&)}}=STR$(mb_abstand_von_oben%,2)
  9400.   ELSE IF MID$(CHAR{{OB_SPEC(formularbaum_adr%,fpopup&)}},3,1)="C" ! Computer-MB
  9401.     CHAR{{OB_SPEC(formularbaum_adr%,flrand&)}}=STR$(cmb_abstand_von_links%,2)
  9402.     CHAR{{OB_SPEC(formularbaum_adr%,flaenge&)}}=STR$(cmb_seitenlaenge%,3)
  9403.     CHAR{{OB_SPEC(formularbaum_adr%,forand&)}}=STR$(cmb_abstand_von_oben%,2)
  9404.   ENDIF
  9405.   '
  9406.   ' Vorbereitung des Dialogs
  9407.   @rsc_draw(formularbaum&,fensterdial%)
  9408. nochmal_formular:
  9409.   ' Duchführen des Dialogs
  9410.   ex_obj%=@rsc_do(formularbaum&,flaenge&,dummy&)  ! dummy, da kein Popupmenu in der Box
  9411.   flrand%=VAL(CHAR{{OB_SPEC(formularbaum_adr%,flrand&)}})
  9412.   furandfz%=VAL(CHAR{{OB_SPEC(formularbaum_adr%,furandfz&)}})
  9413.   fbreite%=VAL(CHAR{{OB_SPEC(formularbaum_adr%,fbreite&)}})
  9414.   furand%=VAL(CHAR{{OB_SPEC(formularbaum_adr%,furand&)}})
  9415.   forandad%=VAL(CHAR{{OB_SPEC(formularbaum_adr%,forandad&)}})
  9416.   flaenge%=VAL(CHAR{{OB_SPEC(formularbaum_adr%,flaenge&)}})
  9417.   forand%=VAL(CHAR{{OB_SPEC(formularbaum_adr%,forand&)}})
  9418.   '
  9419.   @select(formularbaum_adr%,ex_obj%,FALSE)
  9420.   GOSUB objc_update(formularbaum_adr%,ex_obj%)
  9421.   '
  9422.   ' HIER LOGIKKONTROLLE EINBAUEN, SONST ZURÜCKSPRINGEN
  9423.   IF fbreite%+flrand%>79 OR fbreite%<40 ! maximal 79 Zeichen Breite, mind 40 Zeichen
  9424.     erstes_objekt%=fbreite&
  9425.     GOTO nochmal_formular
  9426.   ELSE IF flrand%>20  ! maximal 20 Zeichen Rand
  9427.     erstes_objekt%=flrand&
  9428.     GOTO nochmal_formular
  9429.   ELSE IF furand%<furandfz%+1 ! Logikkontrolle
  9430.     erstes_objekt%=furand&
  9431.     GOTO nochmal
  9432.   ELSE IF flaenge%-forand%-furand%-forandad%<1  ! Logikkontrolle
  9433.     erstes_objekt%=flaenge&
  9434.     GOTO nochmal_formular
  9435.   ENDIF
  9436.   '
  9437.   SELECT ex_obj%
  9438.   CASE ffuer&,fpopup&,fcycle&
  9439.     a$=MID$(CHAR{{OB_SPEC(formularbaum_adr%,fpopup&)}},3,1)
  9440.     IF a$="M" OR a$="C" ! Mahnbescheide+CMB
  9441.       ' nicht benötigte Parameter inaktivieren
  9442.       @do_objc(formularbaum_adr%,furandfz&,8)
  9443.       @del_flag(formularbaum_adr%,furandfz&,8)
  9444.       @objc_update(formularbaum_adr%,furandfz&)
  9445.       @do_objc(formularbaum_adr%,fbreite&,8)
  9446.       @del_flag(formularbaum_adr%,fbreite&,8)
  9447.       @objc_update(formularbaum_adr%,fbreite&)
  9448.       @do_objc(formularbaum_adr%,furand&,8)
  9449.       @del_flag(formularbaum_adr%,furand&,8)
  9450.       @objc_update(formularbaum_adr%,furand&)
  9451.       @do_objc(formularbaum_adr%,forandad&,8)
  9452.       @del_flag(formularbaum_adr%,forandad&,8)
  9453.       @objc_update(formularbaum_adr%,forandad&)
  9454.       '
  9455.       IF a$="M"  ! normaler Mahnbescheid
  9456.         ' Benötigte Parameter einsetzen
  9457.         CHAR{{OB_SPEC(formularbaum_adr%,flrand&)}}=STR$(mb_abstand_von_links%,2)
  9458.         @objc_update(formularbaum_adr%,flrand&)
  9459.         CHAR{{OB_SPEC(formularbaum_adr%,flaenge&)}}=STR$(mb_seitenlaenge%,3)
  9460.         @objc_update(formularbaum_adr%,flaenge&)
  9461.         CHAR{{OB_SPEC(formularbaum_adr%,forand&)}}=STR$(mb_abstand_von_oben%,2)
  9462.         @objc_update(formularbaum_adr%,forand&)
  9463.       ELSE IF a$="C"  ! Computer-MB
  9464.         ' Benötigte Parameter einsetzen
  9465.         CHAR{{OB_SPEC(formularbaum_adr%,flrand&)}}=STR$(cmb_abstand_von_links%,2)
  9466.         @objc_update(formularbaum_adr%,flrand&)
  9467.         CHAR{{OB_SPEC(formularbaum_adr%,flaenge&)}}=STR$(cmb_seitenlaenge%,3)
  9468.         @objc_update(formularbaum_adr%,flaenge&)
  9469.         CHAR{{OB_SPEC(formularbaum_adr%,forand&)}}=STR$(cmb_abstand_von_oben%,2)
  9470.         @objc_update(formularbaum_adr%,forand&)
  9471.       ENDIF
  9472.     ELSE  ! Vollstreckungen
  9473.       CHAR{{OB_SPEC(formularbaum_adr%,flrand&)}}=STR$(abstand_von_links%,2)
  9474.       CHAR{{OB_SPEC(formularbaum_adr%,furandfz&)}}=STR$(abstand_fusszeile%,2)
  9475.       CHAR{{OB_SPEC(formularbaum_adr%,fbreite&)}}=STR$(zeichen_pro_zeile%,2)
  9476.       CHAR{{OB_SPEC(formularbaum_adr%,furand&)}}=STR$(abstand_von_unten%,2)
  9477.       CHAR{{OB_SPEC(formularbaum_adr%,forandad&)}}=STR$(abstand_kopf_vom_oberen_druckrand%,2)
  9478.       CHAR{{OB_SPEC(formularbaum_adr%,flaenge&)}}=STR$(seitenlaenge%,3)
  9479.       CHAR{{OB_SPEC(formularbaum_adr%,forand&)}}=STR$(abstand_von_oben%,2)
  9480.       @objc_update(formularbaum_adr%,forand&)
  9481.       @objc_update(formularbaum_adr%,flaenge&)
  9482.       @objc_update(formularbaum_adr%,flrand&)
  9483.       @undo_objc(formularbaum_adr%,furandfz&,8)
  9484.       @set_flag(formularbaum_adr%,furandfz&,8)
  9485.       @objc_update(formularbaum_adr%,furandfz&)
  9486.       @undo_objc(formularbaum_adr%,fbreite&,8)
  9487.       @set_flag(formularbaum_adr%,fbreite&,8)
  9488.       @objc_update(formularbaum_adr%,fbreite&)
  9489.       @undo_objc(formularbaum_adr%,furand&,8)
  9490.       @set_flag(formularbaum_adr%,furand&,8)
  9491.       @objc_update(formularbaum_adr%,furand&)
  9492.       @undo_objc(formularbaum_adr%,forandad&,8)
  9493.       @set_flag(formularbaum_adr%,forandad&,8)
  9494.       @objc_update(formularbaum_adr%,forandad&)
  9495.     ENDIF
  9496.     GOTO nochmal_formular
  9497.   CASE fertig13&  ! nur dann Werte übernehmen
  9498.     optionsaenderung%=TRUE
  9499.     IF @selected(formularbaum_adr%,snrlinks&)=TRUE
  9500.       seitennrjustierung%=0  ! 0=links, 1=Mitte, 2=rechts
  9501.     ELSE IF @selected(formularbaum_adr%,snrzentriert&)=TRUE
  9502.       seitennrjustierung%=1  ! 0=links, 1=Mitte, 2=rechts
  9503.     ELSE IF @selected(formularbaum_adr%,snrrechts&)=TRUE
  9504.       seitennrjustierung%=2  ! 0=links, 1=Mitte, 2=rechts
  9505.     ENDIF
  9506.     unterschriftsleiste$=CHAR{{OB_SPEC(formularbaum_adr%,unterschrift&)}}
  9507.     IF MID$(CHAR{{OB_SPEC(formularbaum_adr%,fpopup&)}},3,1)="V" ! Vollstreckungen
  9508.       seitenlaenge%=flaenge%
  9509.       abstand_von_oben%=forand%
  9510.       abstand_kopf_vom_oberen_druckrand%=forandad%
  9511.       abstand_fusszeile%=furandfz%
  9512.       abstand_von_unten%=furand%
  9513.       zeichen_pro_zeile%=fbreite%
  9514.       abstand_von_links%=flrand%
  9515.       echter_abstand_von_links%=flrand%
  9516.     ELSE IF MID$(CHAR{{OB_SPEC(formularbaum_adr%,fpopup&)}},3,1)="M" ! Mahnbescheide
  9517.       mb_seitenlaenge%=flaenge%
  9518.       mb_abstand_von_oben%=forand%
  9519.       mb_abstand_von_links%=flrand%
  9520.     ELSE IF MID$(CHAR{{OB_SPEC(formularbaum_adr%,fpopup&)}},3,1)="C" ! Computer-MB
  9521.       cmb_seitenlaenge%=flaenge%
  9522.       cmb_abstand_von_oben%=forand%
  9523.       cmb_abstand_von_links%=flrand%
  9524.     ENDIF
  9525.   ENDSELECT
  9526.   '
  9527.   ' Alles OK, box schließen
  9528.   '
  9529.   ' Beenden des Dialogs
  9530.   @rsc_back(formularbaum&)
  9531.   @select(formularbaum_adr%,ex_obj%,FALSE)
  9532.   @resource_einrichten(1)
  9533. RETURN
  9534. ' *********************************************************
  9535. > PROCEDURE kopien
  9536.   @resource_einrichten(2)
  9537.   kopienbaum_adr%=rsc_adr%(kopienbaum&)
  9538.   @dialog_positionieren(kopienbaum&)
  9539.   ' +++++++++  VORBELEGUNG der KOPIENZAHLFELDER +++++++++++
  9540.   '
  9541.   CHAR{{OB_SPEC(kopienbaum_adr%,k367&)}}=STR$(kopienzahl367%,3)
  9542.   CHAR{{OB_SPEC(kopienbaum_adr%,kzva&)}}=STR$(kopienzahlzva%,3)
  9543.   CHAR{{OB_SPEC(kopienbaum_adr%,kpfueb&)}}=STR$(kopienzahlpfueb%,3)
  9544.   CHAR{{OB_SPEC(kopienbaum_adr%,keva&)}}=STR$(kopienzahleva%,3)
  9545.   CHAR{{OB_SPEC(kopienbaum_adr%,kpfverh&)}}=STR$(kopienzahlpfverh%,3)
  9546.   CHAR{{OB_SPEC(kopienbaum_adr%,kdurchs&)}}=STR$(kopienzahldurchs%,3)
  9547.   CHAR{{OB_SPEC(kopienbaum_adr%,kzahlver&)}}=STR$(kopienzahlzahlverb%,3)
  9548.   CHAR{{OB_SPEC(kopienbaum_adr%,k840&)}}=STR$(kopienzahl840%,3)
  9549.   CHAR{{OB_SPEC(kopienbaum_adr%,kpanfr&)}}=STR$(kopienzahlpanfr%,3)
  9550.   CHAR{{OB_SPEC(kopienbaum_adr%,kema&)}}=STR$(kopienzahlema%,3)
  9551.   CHAR{{OB_SPEC(kopienbaum_adr%,kzvdrohg&)}}=STR$(kopienzahlzvandrohg%,3)
  9552.   CHAR{{OB_SPEC(kopienbaum_adr%,kratenvg&)}}=STR$(kopienzahlratenvgl%,3)
  9553.   CHAR{{OB_SPEC(kopienbaum_adr%,ksihyp&)}}=STR$(kopienzahlsihyp%,3)
  9554.   CHAR{{OB_SPEC(kopienbaum_adr%,ksivstr&)}}=STR$(kopienzahlsivollstr%,3)
  9555.   '
  9556.   ' Vorbereitung des Dialogs
  9557.   rsc_draw(kopienbaum&,fensterdial%)
  9558.   '
  9559.   DO
  9560.     ex_obj%=@rsc_do(kopienbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  9561.     EXIT IF ex_obj%>=fertig17& ! (oder abbruc17&)
  9562.     SELECT ex_obj%
  9563.     CASE up367&,upzva&,uppfueb&,upeva&,uppfverh&,updurchs&,upzahlve&,up840&,uppanfr&,upema&,updroh&,upvgl&,upsivstr&,upsihyp&
  9564.       dummy$=CHAR{{OB_SPEC(kopienbaum_adr%,ex_obj%-1)}}
  9565.       a$=STR$(MIN(VAL(dummy$)+1,99),3)
  9566.       CHAR{{OB_SPEC(kopienbaum_adr%,ex_obj%-1)}}=a$
  9567.       GOSUB objc_update(kopienbaum_adr%,ex_obj%-1)
  9568.     CASE dwn367&,dwnzva&,dwnpfueb&,dwneva&,dwnpfver&,dwndurch&,dwnzahlv&,dwn840&,dwnpanfr&,dwnema&,dwndroh&,dwnvgl&,dwnsivst&,dwnsihyp&
  9569.       dummy$=CHAR{{OB_SPEC(kopienbaum_adr%,ex_obj%+1)}}
  9570.       a$=STR$(MAX(VAL(dummy$)-1,1),3)
  9571.       CHAR{{OB_SPEC(kopienbaum_adr%,ex_obj%+1)}}=a$
  9572.       GOSUB objc_update(kopienbaum_adr%,ex_obj%+1)
  9573.     ENDSELECT
  9574.   LOOP
  9575.   '
  9576.   ' Beenden des Dialogs
  9577.   rsc_back(kopienbaum&)
  9578.   @select(kopienbaum_adr%,ex_obj%,FALSE)
  9579.   '
  9580.   ' Auslesen der Werte, wenn nicht Abbruch gewählt wurde
  9581.   IF ex_obj%=fertig17&
  9582.     kopienzahl367%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,k367&)}})
  9583.     kopienzahlzva%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kzva&)}})
  9584.     kopienzahlpfueb%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kpfueb&)}})
  9585.     kopienzahleva%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,keva&)}})
  9586.     kopienzahlpfverh%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kpfverh&)}})
  9587.     kopienzahldurchs%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kdurchs&)}})
  9588.     kopienzahlzahlverb%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kzahlver&)}})
  9589.     kopienzahl840%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,k840&)}})
  9590.     kopienzahlpanfr%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kpanfr&)}})
  9591.     kopienzahlema%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kema&)}})
  9592.     kopienzahlzvandrohg%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kzvdrohg&)}})
  9593.     kopienzahlratenvgl%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,kratenvg&)}})
  9594.     kopienzahlsihyp%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,ksihyp&)}})
  9595.     kopienzahlsivollstr%=VAL(CHAR{{OB_SPEC(kopienbaum_adr%,ksivstr&)}})
  9596.     optionsaenderung%=TRUE  ! da eventuell geändert
  9597.   ENDIF
  9598.   @resource_einrichten(1)
  9599. RETURN
  9600. ' **************************************************************
  9601. > PROCEDURE zinsrechner
  9602.   @resource_einrichten(2)
  9603.   zinsrechbaum_adr%=rsc_adr%(zinsrechbaum&)
  9604.   @dialog_positionieren(zinsrechbaum&)
  9605.   CHAR{{OB_SPEC(zinsrechbaum_adr%,zprozent&)}}=""
  9606.   CHAR{{OB_SPEC(zinsrechbaum_adr%,zbetrag&)}}=""
  9607.   CHAR{{OB_SPEC(zinsrechbaum_adr%,zabdat&)}}=""
  9608.   CHAR{{OB_SPEC(zinsrechbaum_adr%,zbisdat&)}}=""
  9609.   CHAR{{OB_SPEC(zinsrechbaum_adr%,zzinstag&)}}=""
  9610.   CHAR{{OB_SPEC(zinsrechbaum_adr%,zibetrag&)}}=""
  9611.   '
  9612.   ' Vorbereitung des Dialogs
  9613.   rsc_draw(zinsrechbaum&,fensterdial%)
  9614.   '
  9615. nochmal_zinsrechner:
  9616.   ex_obj%=@rsc_do(zinsrechbaum&,zprozent&,dummy&)  ! dummy, da kein Popupmenu in der Box
  9617.   SELECT ex_obj%
  9618.   CASE zberechn&
  9619.     zprozent$=CHAR{{OB_SPEC(zinsrechbaum_adr%,zprozent&)}}
  9620.     GOSUB zahlenumwandlung(2,zprozent$,zprozent#,dummy#)
  9621.     zbetrag$=CHAR{{OB_SPEC(zinsrechbaum_adr%,zbetrag&)}}
  9622.     GOSUB zahlenumwandlung(7,zbetrag$,zbetrag#,dummy#)
  9623.     zabdat$=CHAR{{OB_SPEC(zinsrechbaum_adr%,zabdat&)}}
  9624.     GOSUB datumsumwandlung(zabdat$,zabdat%,kontrolle%)
  9625.     IF kontrolle%=1
  9626.       ~@rsc_alert(1,"Unzulässiges Datum !"," [OK ",1)
  9627.       @select(zinsrechbaum_adr%,ex_obj%,FALSE)
  9628.       @objc_update(zinsrechbaum_adr%,ex_obj%)
  9629.       GOTO nochmal_zinsrechner
  9630.     ENDIF
  9631.     zbisdat$=CHAR{{OB_SPEC(zinsrechbaum_adr%,zbisdat&)}}
  9632.     GOSUB datumsumwandlung(zbisdat$,zbisdat%,kontrolle%)
  9633.     IF kontrolle%=1
  9634.       ~@rsc_alert(1,"Unzulässiges Datum !"," [OK ",1)
  9635.       @select(zinsrechbaum_adr%,ex_obj%,FALSE)
  9636.       @objc_update(zinsrechbaum_adr%,ex_obj%)
  9637.       GOTO nochmal_zinsrechner
  9638.     ENDIF
  9639.     GOSUB zinstage(zabdat%,zbisdat%,tage%)
  9640.     CHAR{{OB_SPEC(zinsrechbaum_adr%,zzinstag&)}}=STR$(tage%,5)
  9641.     CHAR{{OB_SPEC(zinsrechbaum_adr%,zkalendertage&)}}=STR$(zbisdat%-zabdat%,5)
  9642.     GOSUB is_objc(zinsrechbaum_adr%,zscheckz&,1,*erg%)
  9643.     IF erg%=1  ! Zinssatz über diskont
  9644.       GOSUB scheckzinsen(zabdat%,zbisdat%,zbetrag#,zprozent#,zinsen#)
  9645.     ELSE  ! Fester Zinssatz
  9646.       zinsen#=ROUND(zprozent#*zbetrag#*tage%/36000,2)
  9647.     ENDIF
  9648.     a$=STR$(INT(zinsen#),6)+STR$(FRAC(zinsen#),2,2)
  9649.     CHAR{{OB_SPEC(zinsrechbaum_adr%,zibetrag&)}}=a$
  9650.     @select(zinsrechbaum_adr%,ex_obj%,FALSE)
  9651.     GOSUB objc_update(zinsrechbaum_adr%,ex_obj%)
  9652.     GOSUB objc_update(zinsrechbaum_adr%,zibetrag&)
  9653.     GOSUB objc_update(zinsrechbaum_adr%,zzinstag&)
  9654.     GOSUB objc_update(zinsrechbaum_adr%,zkalendertage&)
  9655.     GOTO nochmal_zinsrechner
  9656.   ENDSELECT
  9657.   '
  9658.   ' Beenden des Dialogs
  9659.   @rsc_back(zinsrechbaum&)
  9660.   @select(zinsrechbaum_adr%,ex_obj%,FALSE)
  9661.   @resource_einrichten(1)
  9662. RETURN
  9663. ' ***************************************************************
  9664. > PROCEDURE overlay
  9665.   @resource_einrichten(2)
  9666.   DIM a$(50)  ! Hier werden overlaydaten zwischengespeichert (max 50*32 kB)
  9667.   overlaybaum_adr%=rsc_adr%(overlaybaum&)
  9668.   @dialog_positionieren(overlaybaum&)
  9669.   CHAR{{OB_SPEC(overlaybaum_adr%,ovdateipfad&)}}=SPACE$(59)
  9670.   CHAR{{OB_SPEC(overlaybaum_adr%,ovdateilaenge&)}}=SPACE$(7)
  9671.   CHAR{{OB_SPEC(overlaybaum_adr%,ovffposition&)}}=SPACE$(7)
  9672.   CHAR{{OB_SPEC(overlaybaum_adr%,ovspeicher&)}}=SPACE$(7)
  9673.   @befehl_einsetzen(overlaybaum_adr%,oveinleitung&,overlayeinleitung$)
  9674.   @befehl_einsetzen(overlaybaum_adr%,ovnachspann&,overlaynachspann$)
  9675.   '
  9676.   ' Vorbereitung des Dialogs
  9677.   rsc_draw(overlaybaum&,fensterdial%)
  9678.   erstes_objekt%=ovnr&
  9679.   '
  9680. nochmal_overlay:
  9681.   ex_obj%=@rsc_do(overlaybaum&,ovnr&,dummy&)  ! dummy, da kein Popupmenu in der Box
  9682.   SELECT ex_obj%
  9683.   CASE ovdateipfad&,ovdateiname&
  9684.     auswahl$=@fileselect$("Overlaydatei laden",boot_pfad$+"\PRT\MUSTER\*.OLY","OVERLAY.OLY")
  9685.     CHAR{{OB_SPEC(overlaybaum_adr%,ovdateipfad&)}}=LEFT$(auswahl$,59)+SPACE$(59-LEN(auswahl$))
  9686.     objc_update(overlaybaum_adr%,ovdateipfad&)
  9687.     IF EXIST(auswahl$)=TRUE
  9688.       OPEN "I",#1,auswahl$
  9689.       l%=LOF(#1)
  9690.       CHAR{{OB_SPEC(overlaybaum_adr%,ovdateilaenge&)}}=STR$(l%,7)
  9691.       objc_update(overlaybaum_adr%,ovdateilaenge&)
  9692.       '
  9693.       ' Daten laden
  9694.       max_index%=INT(l%/32767)  ! Höchstes Element voller Länge
  9695.       FOR i%=1 TO max_index%
  9696.         a$(i%)=INPUT$(32767,#1)
  9697.       NEXT i%
  9698.       restlaenge%=l%-max_index%*32767
  9699.       a$(max_index%+1)=INPUT$(restlaenge%,#1)
  9700.       CLOSE #1
  9701.       '
  9702.       ' von hinten auf Formfeed untersuchen
  9703.       FOR i%=max_index%+1 DOWNTO 0
  9704.         ff_pos%=RINSTR(a$(i%),CHR$(12))
  9705.         EXIT IF ff_pos%>0  ! Ein Formfeed gefunden
  9706.       NEXT i%
  9707.       IF ff_pos%=0  ! gar kein FF enthalten
  9708.         ff_pos%=l%  ! damit die ganze Datei übertragen wird
  9709.       ELSE  ! FF existiert
  9710.         ff_pos%=(i%-1)*32767+ff_pos%  ! Absolut
  9711.       ENDIF
  9712.       CHAR{{OB_SPEC(overlaybaum_adr%,ovffposition&)}}=STR$(l%-ff_pos%,7)
  9713.       objc_update(overlaybaum_adr%,ovffposition&)
  9714.       CHAR{{OB_SPEC(overlaybaum_adr%,ovspeicher&)}}=STR$(ff_pos%,7)
  9715.       objc_update(overlaybaum_adr%,ovspeicher&)
  9716.     ENDIF
  9717.     GOTO nochmal_overlay
  9718.   CASE ovok&
  9719.     @befehl_auslesen(overlaybaum_adr%,oveinleitung&,overlayeinleitung$,dummy1%)
  9720.     @befehl_auslesen(overlaybaum_adr%,ovnachspann&,overlaynachspann$,dummy2%)
  9721.     IF dummy1%=TRUE OR dummy2%=TRUE
  9722.       GOTO nochmal_overlay
  9723.     ENDIF
  9724.   CASE ovsenden&
  9725.     @befehl_auslesen(overlaybaum_adr%,oveinleitung&,overlayeinleitung$,dummy1%)
  9726.     @befehl_auslesen(overlaybaum_adr%,ovnachspann&,overlaynachspann$,dummy2%)
  9727.     IF dummy1%=TRUE OR dummy2%=TRUE
  9728.       GOTO nochmal_overlay
  9729.     ENDIF
  9730.     '
  9731.     IF GEMDOS(17)=0 ! Drucker ansprechbar ?
  9732.       DEFMOUSE 0
  9733.       dummy%=@rsc_alert(1,"Ihr Drucker nimmt|keine Daten ab.|Bitte einschalten !","[OK|[Abbruch",1)
  9734.       IF dummy%=2
  9735.         GOTO nochmal_overlay
  9736.       ELSE
  9737.         GOSUB mausform(9)  ! Kaffeetasse
  9738.       ENDIF
  9739.     ENDIF
  9740.     '
  9741.     @initialisierung
  9742.     LPRINT overlayeinleitung$;
  9743.     '
  9744.     ' Daten senden
  9745.     FOR i%=1 TO INT(ff_pos%/32767)  ! Alle vollbesetzten Elemente senden
  9746.       LPRINT a$(i%);               ! Druckdaten senden
  9747.       SUB ff_pos%,32767  ! Zu sendende Restzeichenzahl
  9748.     NEXT i%
  9749.     LPRINT LEFT$(a$(i%),ff_pos%-1);    ! nicht ganz vollbesetzte Zeile
  9750.     LPRINT overlaynachspann$;
  9751.     DEFMOUSE 0
  9752.     '
  9753.     dummy%=@rsc_alert(1,"Testdruck gefällig ?","[OK|[Abbruch",1)
  9754.     IF dummy%=1
  9755.       LPRINT overlayaufruf$;
  9756.       FOR i%=1 TO 10
  9757.         LPRINT SPACE$(i%);"Overlay - Testdruck"
  9758.       NEXT i%
  9759.       LPRINT formfeed$;
  9760.     ENDIF
  9761.   ENDSELECT
  9762.   '
  9763.   ' Beenden des Dialogs
  9764.   @rsc_back(overlaybaum&)
  9765.   @select(overlaybaum_adr%,ex_obj%,FALSE)
  9766.   ERASE a$()  ! Brauchen wir nicht mehr
  9767.   @resource_einrichten(1)
  9768. RETURN
  9769. ' ****************************************************************
  9770. '
  9771. ' ==================================
  9772. ' DATEIKONVERTIERUNG ATARI>>WINDOWS
  9773. ' =================================
  9774. ' ******************************************************************
  9775. > PROCEDURE dateikonvertierung
  9776.   @resource_einrichten(2)
  9777.   konvertbaum_adr%=rsc_adr%(konvertbaum&)
  9778.   @dialog_positionieren(konvertbaum&)
  9779.   CHAR{{OB_SPEC(konvertbaum_adr%,ko_quellpfad&)}}=boot_pfad$+"\"
  9780.   CHAR{{OB_SPEC(konvertbaum_adr%,ko_zielpfad&)}}=boot_pfad$+"\"
  9781.   '
  9782.   ' Vorbereitung des Dialogs
  9783.   rsc_draw(konvertbaum&,fensterdial%)
  9784.   '
  9785. nochmalkonvert:
  9786.   ex_obj%=@rsc_do(konvertbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  9787.   SELECT ex_obj%
  9788.   CASE ko_qpfadauswahl&,ko_quellpfad&
  9789.     ' Pfad festlegen
  9790.     ko_quellpfad$=@fileselect$("Quellpfad festlegen",CHAR{{OB_SPEC(konvertbaum_adr%,ko_quellpfad&)}},"")
  9791.     ko_quellpfad$=LEFT$(ko_quellpfad$,RINSTR(ko_quellpfad$,"\"))
  9792.     IF ko_quellpfad$<>""
  9793.       @pfad_einsetzen(konvertbaum_adr%,ko_quellpfad&,ko_quellpfad$,65)
  9794.     ENDIF
  9795.     GOTO nochmalkonvert
  9796.   CASE ko_zpfadauswahl&,ko_zielpfad&
  9797.     ' Pfad festlegen
  9798.     ko_zielpfad$=@fileselect$("Zielpfad festlegen",CHAR{{OB_SPEC(konvertbaum_adr%,ko_zielpfad&)}},"")
  9799.     ko_zielpfad$=LEFT$(ko_zielpfad$,RINSTR(ko_zielpfad$,"\"))
  9800.     IF ko_zielpfad$<>""
  9801.       @pfad_einsetzen(konvertbaum_adr%,ko_zielpfad&,ko_zielpfad$,65)
  9802.     ENDIF
  9803.     GOTO nochmalkonvert
  9804.   CASE ko_ok&
  9805.     IF CHAR{{OB_SPEC(konvertbaum_adr%,ko_quellpfad&)}}=CHAR{{OB_SPEC(konvertbaum_adr%,ko_zielpfad&)}}
  9806.       ~@rsc_alert(1,"Achtung !!!|Quell- und Zielpfad|müssen unterschiedlich|sein. Bitte ändern."," [OK ",1)=1
  9807.       @select(konvertbaum_adr%,ex_obj%,FALSE)
  9808.       @objc_update(konvertbaum_adr%,ex_obj%)
  9809.       GOTO nochmalkonvert
  9810.     ENDIF
  9811.     IF @rsc_alert(1,"Achtung !!!|Die aktuell im Speicher|befindliche Aufstellung|wird gelöscht. Sichern ?","[Ja|[Nein",1)=1
  9812.       @diskspeichern
  9813.     ENDIF
  9814.   ENDSELECT
  9815.   '
  9816.   ' Beenden des Dialogs
  9817.   @select(konvertbaum_adr%,ex_obj%,FALSE)
  9818.   @rsc_back(konvertbaum&)
  9819.   ' Konvertierung durchführen
  9820.   IF ex_obj%=ko_ok&
  9821.     @select(konvertbaum_adr%,ex_obj%,FALSE)
  9822.     @druckerladen(4)  ! Konvertierungstreiber laden
  9823.     @konvertierung
  9824.     @druckerladen(1)  ! wieder zurück zum Standarddrucker
  9825.     @feldleeren  ! damit nichts angezeigt wird
  9826.     @forderungstextfeld
  9827.     ~@rsc_alert(1,"Achtung !!!|Lesen SIe am Zielpfad|die Datei KONVERT.LOG|wegen Nachbearbeitung."," [OK ",1)
  9828.   ENDIF
  9829.   @resource_einrichten(1)
  9830. RETURN
  9831. ' ********************************************************************
  9832. > PROCEDURE konvertierung
  9833.   '  @resource_einrichten(2) überflüssig, da immer schon eingerichtet
  9834.   konvinfobaum_adr%=rsc_adr%(konvinfobaum&)
  9835.   @dialog_positionieren(konvinfobaum&)
  9836.   CHAR{{OB_SPEC(konvinfobaum_adr%,ki_quellpfad&)}}=CHAR{{OB_SPEC(konvertbaum_adr%,ko_quellpfad&)}}
  9837.   CHAR{{OB_SPEC(konvinfobaum_adr%,ki_zielpfad&)}}=CHAR{{OB_SPEC(konvertbaum_adr%,ko_zielpfad&)}}
  9838.   '
  9839.   ' LOGBUCH-Datei anlegen
  9840.   OPEN "O",#2,CHAR{{OB_SPEC(konvertbaum_adr%,ko_zielpfad&)}}+"KONVERT.LOG"
  9841.   PRINT #2,"LOGBUCH zur Dateiumwandlung von "+DATE$+" um "+TIME$+" Uhr"
  9842.   '
  9843.   ' Vorbereitung des Dialogs
  9844.   rsc_draw(konvinfobaum&,0)  !fensterdial%)
  9845.   ' =======================================
  9846.   ' DISKLADEN aufrufen und Pfad mit Dateinamen übergeben >> lädt direkt
  9847.   @ebene_konvertieren(CHAR{{OB_SPEC(konvinfobaum_adr%,ki_quellpfad&)}},CHAR{{OB_SPEC(konvinfobaum_adr%,ki_zielpfad&)}})
  9848.   '
  9849.   '  ex_obj%=@rsc_do(konvinfobaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  9850.   '
  9851.   ' Beenden des Dialogs
  9852.   @rsc_back(konvinfobaum&)
  9853.   '  @select(konvinfobaum_adr%,ex_obj%,FALSE)  ! kein ex_obj% vorhanden
  9854.   '  @resource_einrichten(1) entfällt wegen drunterliegendem Dialog
  9855.   CLOSE #2 ! Logbuchdatei
  9856. RETURN
  9857. ' ********************************************************************
  9858. > PROCEDURE pfad_einsetzen(tree%,obj&,pfad$,l%)
  9859.   IF LEN(pfad$)<=l%  ! String paßt rein, also direkt einseten
  9860.   ELSE ! String ist zu lange, sinnvoll kürzen
  9861.     pos1%=INSTR(pfad$,"\",4)  ! vorne mind 1 Ordner zeigen F:\xyz (deshalb ab 4. Stelle)
  9862.     pos2%=INSTR(pfad$,"\",LEN(pfad$)-(l%-pos1%-3))  ! -3 für "..."
  9863.     pfad$=LEFT$(pfad$,pos1%)+"..."+MID$(pfad$,pos2%)
  9864.   ENDIF
  9865.   CHAR{{OB_SPEC(tree%,obj&)}}=pfad$
  9866.   @objc_update(tree%,obj&)
  9867. RETURN
  9868. ' **********************************************************************
  9869. > PROCEDURE ordner_neu_anlegen(ordnername$)
  9870. ' ## INLINE:
  9871. ' $0000: 4d 49 53 54 33 2e 44 41 54 00 00 1e 00 00 00 05 
  9872. ' $0010: 00 60 23 b3 e7 20 bd 0f 11 63 00 00 02 33 4d 49 
  9873. ' $0020: 53 54 33 2e 44 41 54 00 00 54 00 20 
  9874. ' 44  Bytes.
  9875.   INLINE dta_adr%,44
  9876.   ~FSETDTA(dta_adr%)  ! damit die eigentlich suchende, aufrufende DTA bleibt
  9877.   ordnername&=FSFIRST(ordnername$+"*.*",&X10000) ! normale Dateien und Ordner
  9878.   attr|=BYTE{ADD(BASEPAGE,149)}
  9879.   IF ordnername&=0 AND BTST(attr|,4)=TRUE  ! Ordner gibts
  9880.   ELSE
  9881.     MKDIR ordnername$  ! ORDNER ANLEGEN
  9882.   ENDIF
  9883.   ~FSETDTA(ADD(BASEPAGE,128))  ! wiederherstellung der aufrufenden DTA
  9884. RETURN
  9885. ' *****************************************************************
  9886. > PROCEDURE ebene_konvertieren(quelle$,ziel$) ! jeweils mit \, legt auch Ordner an
  9887.   LOCAL attr|,dateiname&,dateiname$,quelldateiname$,destinationsdateiname$
  9888.   DIM quellpfade$(2000),zielpfade$(2000)  ! Für Unterverzeichnisse
  9889.   quellpfade$(0)=quelle$  ! Urpfad
  9890.   zielpfade$(0)=ziel$  ! Urpfad
  9891.   index%=1
  9892.   '
  9893.   ~FSETDTA(ADD(BASEPAGE,128))
  9894.   REPEAT
  9895.     dateiname&=FSFIRST(quellpfade$(0)+"*.*",&X10000) ! normale Dateien und Ordner
  9896.     WHILE dateiname&=0  ! Solange es Dateien gibt
  9897.       attr|=BYTE{ADD(BASEPAGE,149)}
  9898.       dateiname$=CHAR{ADD(BASEPAGE,158)}
  9899.       quelldateiname$=quellpfade$(0)+dateiname$
  9900.       IF dateiname$<>"." AND INSTR(dateiname$,"..")=0
  9901.         IF BTST(attr|,4)=TRUE  ! Ordner
  9902.           @ordner_neu_anlegen(zielpfade$(0)+dateiname$)
  9903.           quellpfade$(index%)=quellpfade$(0)+dateiname$+"\"
  9904.           zielpfade$(index%)=zielpfade$(0)+dateiname$+"\"
  9905.           INC index%
  9906.         ELSE IF RIGHT$(quelldateiname$,3)="DAT"
  9907.           destinationsdateiname$=zielpfade$(0)+LEFT$(dateiname$,INSTR(dateiname$,"."))+"DAT"
  9908.           @konvert(quelldateiname$,destinationsdateiname$)
  9909.         ENDIF
  9910.       ENDIF
  9911.       dateiname&=FSNEXT() ! normale Dateien und Ordner
  9912.     WEND
  9913.     DELETE quellpfade$(0)  ! wenn Unterverzeichnis abgearbeitet
  9914.     DELETE zielpfade$(0)   ! nächste nachrücken lassen
  9915.     DEC index%
  9916.   UNTIL quellpfade$(0)=""
  9917.   ERASE quellpfade$()  ! Brauchen wir nicht mehr
  9918.   ERASE zielpfade$()
  9919. RETURN
  9920. ' ****************************************
  9921. ' Konvertiert eine Datei
  9922. > PROCEDURE konvert(source$,dest$)
  9923.   @pfad_einsetzen(konvinfobaum_adr%,ki_quellpfad&,source$,65)
  9924.   @pfad_einsetzen(konvinfobaum_adr%,ki_zielpfad&,dest$,65)
  9925.   LOCAL a%,b%,c%,i%
  9926.   b%=1
  9927.   ~FSETDTA(dta_adr%)  ! damit die eigentlich suchende, aufrufende DTA bleibt
  9928.   b%=1 ! Voreinstellung
  9929.   IF @au$(dest$)<>dest$  ! dann Sonderzeichen enthalten
  9930.     PRINT #2,"Datei "+dest$+": Sonderzeichen(ÄÖܧäöüß) im Dateinamen durch '_' ersetzt"
  9931.   sonderzeichen:
  9932.     DATA Ä,Ö,Ü,§,ä,ö,ü,ß
  9933.     RESTORE sonderzeichen
  9934.     FOR i%=1 TO 8  ! da 8 Sonderzeichen
  9935.       READ sz$
  9936.       DO
  9937.         pos%=INSTR(dest$,sz$)
  9938.         EXIT IF pos%=0
  9939.         dest$=LEFT$(dest$,pos%-1)+"_"+MID$(dest$,pos%+1)
  9940.       LOOP
  9941.     NEXT i%
  9942.   ENDIF
  9943.   IF EXIST(@au$(dest$))
  9944.     b%=@rsc_alert(1,"Die Datei "+MID$(dest$,RINSTR(dest$,"\")+1)+"|existiert schon am Zielpfad !","[Weiter|[Abbruch",1)
  9945.   ENDIF
  9946.   IF b%=1
  9947.     GOSUB feldleeren
  9948.     @diskladen(source$) ! ==> alle Variablen eingelesen
  9949.     '
  9950.     ' Konvertiert speichern
  9951.     GOSUB mausform(8)  ! DISKETTE
  9952.     OPEN "O",#1,@au$(dest$)
  9953.     ' Dateiheader, FALLDATEN USW.
  9954.     IF mitmwst%=0  ! dann ist bei Mark -1 angesagt !
  9955.       mitmwst%=-1
  9956.     ENDIF
  9957.     WRITE #1,mitmwst%,@au$(az$)
  9958.     WRITE #1,@au$(vollstreckungsgerichtanrede1$),@au$(vollstreckungsgerichtanrede2$),@au$(vollstreckungsgerichtstrasse$)
  9959.     WRITE #1,@au$(vollstreckungsgerichtort$),@au$(glaeubigeranrede1$),@au$(glaeubigeranrede2$)
  9960.     WRITE #1,@au$(glaeubigerstrasse$),@au$(glaeubigerort$),@au$(glaeubigergf1$)
  9961.     WRITE #1,@au$(glaeubigergf2$),@au$(schuldneranrede1$),@au$(schuldneranrede2$)
  9962.     WRITE #1,@au$(schuldnerstrasse$),@au$(schuldnerort$),@au$(schuldnergf1$)
  9963.     IF titelart$="Urteil"
  9964.       titelart%=1
  9965.     ELSE IF titelart$="Vergleich"
  9966.       titelart%=2
  9967.     ELSE IF titelart$="Vollstreckungsbescheid"
  9968.       titelart%=3
  9969.     ELSE IF titelart$="Kostenfestsetzungsbeschluß"
  9970.       titelart%=4
  9971.     ELSE IF titelart$="notar. Schuldanerkenntnis"
  9972.       titelart%=5
  9973.     ELSE
  9974.       PRINT #2,"Datei "+dest$+": Titelart auf Urteil eingestellt"
  9975.       titelart%=1  ! Voreinstellung
  9976.     ENDIF
  9977.     WRITE #1,@au$(schuldnergf2$),titelart%,@au$(titelgericht$),@au$(titelort$)
  9978.     IF titeldatum$<>""
  9979.       WRITE #1,LEFT$(titeldatum$,2)+"."+MID$(titeldatum$,3,2)+"."+RIGHT$(titeldatum$,2),@au$(titelaz$)
  9980.     ELSE
  9981.       WRITE #1,LEFT$(DATE$,2)+"."+MID$(DATE$,4,2)+"."+RIGHT$(DATE$,2),@au$(titelaz$)
  9982.       PRINT #2,"Datei "+dest$+": Titeldatum fehlte und wurde auf aktuelles Datum gesetzt"
  9983.     ENDIF
  9984.     ' AUFSTELLUNGSDATEN
  9985.     FOR i%=1 TO maximalbuchungen%
  9986.       EXIT IF fdgart#(i%)=0  ! WENN KEINE FORDERUNG DRINSTEHT,IST DAS FELD ZU ENDE
  9987.       '
  9988.       @datums_rueckumwandlung(fdgdatum%(i%),t%,m%,j%)
  9989.       @datumsstring_erstellen(t%,m%,j%,2,dummy$)
  9990.       WRITE #1,betrag#(i%),dummy$  ! Forderungsdatum tt.mm.jj
  9991.       IF fdgart#(i%)=14
  9992.         WRITE #1,restbetrag#(i%),fdgname$(i%)  ! fdgname gibts bei RA-PC nicht
  9993.         '                                     ! aber GELD_HER(Win) kanns lesen
  9994.       ELSE
  9995.         WRITE #1,restbetrag#(i%),""  ! "" schon damals unbenutzt
  9996.       ENDIF
  9997.       IF zinsdatum%(i%)>0
  9998.         @datums_rueckumwandlung(zinsdatum%(i%),t%,m%,j%)
  9999.         @datumsstring_erstellen(t%,m%,j%,2,dummy$)
  10000.       ELSE IF zinsdatum%(i%)<0
  10001.         dummy$=LEFT$(DATE$,6)+RIGHT$(DATE$,2)
  10002.         PRINT #2,"Datei "+dest$+": in Zeile ";i%;" Datum ab Zustellung/VB auf heute gesetzt"
  10003.       ENDIF
  10004.       WRITE #1,zinssatz#(i%),dummy$  ! Zinsdatum tt.mm.jj
  10005.       WRITE #1,fdgart#(i%),""
  10006.       WRITE #1,0,""
  10007.     NEXT i%
  10008.     WRITE #1,0,"***",0,"***",0
  10009.     TOUCH #1  ! Dateidatum aktualisieren
  10010.     DEFMOUSE 0
  10011.     CLOSE #1
  10012.   ENDIF
  10013.   ~FSETDTA(ADD(BASEPAGE,128))  ! wiederherstellung der aufrufenden DTA
  10014. RETURN
  10015. ' **************************************************
  10016. > FUNCTION au$(umwandel$)
  10017.   GOSUB ausgabeumwandlung(umwandel$,rueck$)
  10018.   RETURN rueck$
  10019. ENDFUNC
  10020. ' ***********************************************
  10021. '
  10022. '
  10023. ' ===================================================
  10024. ' GEBÜHRENRECHNER
  10025. ' =====================================================
  10026. ' **************************************************************
  10027. > PROCEDURE gebuehrenrechner
  10028.   @resource_einrichten(2)
  10029.   GOSUB inf_laden(TRUE)  ! ohne Fileselect
  10030.   CLR swnieder#,faktor3#,faktor5#,faktor7#,faktor10#,faktor13#,faktcopy#,faktkm#
  10031.   CLR faktgk1#,faktgk5#,faktzust#,summe3#,summe5#,summe7#,summe10#,summe13#
  10032.   CLR sumcopy#,sumkm#,summegk1#,summegk5#,sumzust#,proauslg#
  10033.   gebuehrinfobaum_adr%=rsc_adr%(gebuehrinfobaum&)
  10034.   @dialog_positionieren(gebuehrinfobaum&)
  10035.   FOR i%=pf_inf& TO pf_verau&
  10036.     GOSUB hide(gebuehrinfobaum_adr%,i%)
  10037.   NEXT i%
  10038.   GOSUB unhide(gebuehrinfobaum_adr%,pf_sw&)  ! Voreinstellung: Streitwertpfeil sichtbar
  10039.   aktueller_pfeil%=pf_sw&
  10040.   swhoch#=600
  10041.   GOSUB del_flag(gebuehrinfobaum_adr%,swgenau&,8)  ! Streitwertbox uneditierbar
  10042.   GOSUB do_objc(gebuehrinfobaum_adr%,pkhnein&,1) ! Voreinstellung: keine PKH
  10043.   GOSUB undo_objc(gebuehrinfobaum_adr%,pkhja&,1)
  10044.   GOSUB do_objc(gebuehrinfobaum_adr%,mwstja&,1) ! Voreinstellung: mit MwSt
  10045.   GOSUB undo_objc(gebuehrinfobaum_adr%,mwstnein&,1)
  10046.   GOSUB del_flag(gebuehrinfobaum_adr%,proauslg&,8) ! nicht editierbar
  10047.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,prozust&)}}=STR$(gkzust#*100,9)
  10048.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor3&)}}="0"
  10049.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor5&)}}="0"
  10050.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor7&)}}="0"
  10051.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor10&)}}="0"
  10052.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor13&)}}="0"
  10053.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktcopy&)}}="  0"
  10054.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktkm&)}}="    0"
  10055.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktgk1&)}}="0"
  10056.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktgk5&)}}="0"
  10057.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktzust&)}}="0"
  10058.   a$="      000"
  10059.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe3&)}}=a$
  10060.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe5&)}}=a$
  10061.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe7&)}}=a$
  10062.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe10&)}}=a$
  10063.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe13&)}}=a$
  10064.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumauslg&)}}=a$
  10065.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumcopy&)}}=a$
  10066.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumkm&)}}=a$
  10067.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,zwisumme&)}}=a$
  10068.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summwst&)}}=a$
  10069.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summegk1&)}}=a$
  10070.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summegk5&)}}=a$
  10071.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumzust&)}}=a$
  10072.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,proauslg&)}}="     000"
  10073.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumverau&)}}=a$
  10074.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,gessumme&)}}="       000"
  10075.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swgenau&)}}="        000"
  10076.   swnieder#=0
  10077.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swnieder&)}}=STR$(swnieder#,9)
  10078.   swhoch#=600
  10079.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swhoch&)}}=STR$(swhoch#,9)
  10080.   '
  10081.   rsc_draw(gebuehrinfobaum&,fensterdial%)
  10082.   GOSUB kosten_und_gebuehren_einsetzen(600)
  10083.   '
  10084.   DO
  10085.     ex_obj%=@rsc_do(gebuehrinfobaum&,erstes_objekt%,dummy&)
  10086.     SELECT ex_obj%  ! erste Selektierung setzen der exitobjekte bei
  10087.       ' Anwahl über die tastaturbedienbaren Strings
  10088.     CASE bedienhoch&
  10089.       alter_pfeil%=aktueller_pfeil%
  10090.       DEC aktueller_pfeil%
  10091.       aktueller_pfeil%=MAX(pf_inf&,aktueller_pfeil%)
  10092.       GOSUB hide(gebuehrinfobaum_adr%,alter_pfeil%)
  10093.       GOSUB unhide(gebuehrinfobaum_adr%,aktueller_pfeil%)
  10094.       GOSUB objc_update(gebuehrinfobaum_adr%,pfeilbox&)  ! Alle Pfeile
  10095.     CASE bedienrunter&
  10096.       alter_pfeil%=aktueller_pfeil%
  10097.       INC aktueller_pfeil%
  10098.       aktueller_pfeil%=MIN(pf_verau&,aktueller_pfeil%)
  10099.       GOSUB hide(gebuehrinfobaum_adr%,alter_pfeil%)
  10100.       GOSUB unhide(gebuehrinfobaum_adr%,aktueller_pfeil%)
  10101.       GOSUB objc_update(gebuehrinfobaum_adr%,pfeilbox&)  ! Alle Pfeile
  10102.     CASE bedienplus&
  10103.       SELECT aktueller_pfeil%
  10104.       CASE pf_inf&
  10105.         ex_obj%=infdatei&
  10106.       CASE pf_sw&
  10107.         ex_obj%=swup&
  10108.       CASE pf_pkh&
  10109.         ' Umschaltung mit pfeil links ODER pfeil rechts
  10110.         GOSUB is_objc(gebuehrinfobaum_adr%,pkhja&,1,*dummy%)
  10111.         IF dummy%=0 ! dann war PKHNEIN selektiert
  10112.           ex_obj%=pkhja&
  10113.           GOSUB do_objc(gebuehrinfobaum_adr%,pkhja&,1)
  10114.           GOSUB undo_objc(gebuehrinfobaum_adr%,pkhnein&,1)
  10115.         ELSE
  10116.           ex_obj%=pkhnein&
  10117.           GOSUB do_objc(gebuehrinfobaum_adr%,pkhnein&,1)
  10118.           GOSUB undo_objc(gebuehrinfobaum_adr%,pkhja&,1)
  10119.         ENDIF
  10120.       CASE pf_3&
  10121.         ex_obj%=up3&
  10122.       CASE pf_5&
  10123.         ex_obj%=up5&
  10124.       CASE pf_7&
  10125.         ex_obj%=up7&
  10126.       CASE pf_10&
  10127.         ex_obj%=up10&
  10128.       CASE pf_13&
  10129.         ex_obj%=up13&
  10130.       CASE pf_copy&
  10131.         ex_obj%=upcopy&
  10132.       CASE pf_km&
  10133.         ex_obj%=upkm&
  10134.       CASE pf_mwst&
  10135.         ' Umschaltung mit pfeil links ODER pfeil rechts
  10136.         GOSUB is_objc(gebuehrinfobaum_adr%,mwstja&,1,*dummy%)
  10137.         IF dummy%=0 ! dann war PKHNEIN selektiert
  10138.           ex_obj%=mwstja&
  10139.           GOSUB do_objc(gebuehrinfobaum_adr%,mwstja&,1)
  10140.           GOSUB undo_objc(gebuehrinfobaum_adr%,mwstnein&,1)
  10141.         ELSE
  10142.           ex_obj%=mwstnein&
  10143.           GOSUB do_objc(gebuehrinfobaum_adr%,mwstnein&,1)
  10144.           GOSUB undo_objc(gebuehrinfobaum_adr%,mwstja&,1)
  10145.         ENDIF
  10146.       CASE pf_gk1&
  10147.         ex_obj%=gk1up&
  10148.       CASE pf_gk5&
  10149.         ex_obj%=gk5up&
  10150.       CASE pf_zust&
  10151.         ex_obj%=zustup&
  10152.       CASE pf_verau&
  10153.         ex_obj%=proauslg&
  10154.       ENDSELECT
  10155.     CASE bedienminus&
  10156.       SELECT aktueller_pfeil%
  10157.       CASE pf_inf&
  10158.         ex_obj%=infdatei&
  10159.       CASE pf_sw&
  10160.         ex_obj%=swdown&
  10161.       CASE pf_pkh&
  10162.         ' Umschaltung mit pfeil links ODER pfeil rechts
  10163.         GOSUB is_objc(gebuehrinfobaum_adr%,pkhja&,1,*dummy%)
  10164.         IF dummy%=0 ! dann war PKHNEIN selektiert
  10165.           ex_obj%=pkhja&
  10166.           GOSUB do_objc(gebuehrinfobaum_adr%,pkhja&,1)
  10167.           GOSUB undo_objc(gebuehrinfobaum_adr%,pkhnein&,1)
  10168.         ELSE
  10169.           ex_obj%=pkhnein&
  10170.           GOSUB do_objc(gebuehrinfobaum_adr%,pkhnein&,1)
  10171.           GOSUB undo_objc(gebuehrinfobaum_adr%,pkhja&,1)
  10172.         ENDIF
  10173.       CASE pf_3&
  10174.         ex_obj%=down3&
  10175.       CASE pf_5&
  10176.         ex_obj%=down5&
  10177.       CASE pf_7&
  10178.         ex_obj%=down7&
  10179.       CASE pf_10&
  10180.         ex_obj%=down10&
  10181.       CASE pf_13&
  10182.         ex_obj%=down13&
  10183.       CASE pf_copy&
  10184.         ex_obj%=downcopy&
  10185.       CASE pf_km&
  10186.         ex_obj%=downkm&
  10187.       CASE pf_mwst&
  10188.         ' Umschaltung mit pfeil links ODER pfeil rechts
  10189.         GOSUB is_objc(gebuehrinfobaum_adr%,mwstja&,1,*dummy%)
  10190.         IF dummy%=0 ! dann war PKHNEIN selektiert
  10191.           ex_obj%=mwstja&
  10192.           GOSUB do_objc(gebuehrinfobaum_adr%,mwstja&,1)
  10193.           GOSUB undo_objc(gebuehrinfobaum_adr%,mwstnein&,1)
  10194.         ELSE
  10195.           ex_obj%=mwstnein&
  10196.           GOSUB do_objc(gebuehrinfobaum_adr%,mwstnein&,1)
  10197.           GOSUB undo_objc(gebuehrinfobaum_adr%,mwstja&,1)
  10198.         ENDIF
  10199.       CASE pf_gk1&
  10200.         ex_obj%=gk1down&
  10201.       CASE pf_gk5&
  10202.         ex_obj%=gk5down&
  10203.       CASE pf_zust&
  10204.         ex_obj%=zustdown&
  10205.       CASE pf_verau&
  10206.         ex_obj%=verauslg&
  10207.       ENDSELECT
  10208.     ENDSELECT
  10209.     SELECT ex_obj%  ! zweite Selektierung zum Poken der Faktoren und Streitwerte
  10210.     CASE infdatei&
  10211.       GOSUB inf_laden(FALSE)  ! mit Fileselect
  10212.     CASE ostwest&
  10213.       IF CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ostwest&)}}="West"
  10214.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ostwest&)}}="Ost "
  10215.         ostwestfaktor#=0.8  ! Ossi-Anwälte kriegen weniger Kohle
  10216.       ELSE
  10217.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ostwest&)}}="West"
  10218.         ostwestfaktor#=1
  10219.       ENDIF
  10220.       GOSUB objc_update(gebuehrinfobaum_adr%,ostwest&)
  10221.       GOSUB kosten_und_gebuehren_einsetzen(swhoch#)
  10222.       ' Alle Zeilen neu durchrechnen
  10223.       GOSUB quersummen_berechnen(up3&)
  10224.       GOSUB quersummen_berechnen(up5&)
  10225.       GOSUB quersummen_berechnen(up7&)
  10226.       GOSUB quersummen_berechnen(up10&)
  10227.       GOSUB quersummen_berechnen(up13&)
  10228.       GOSUB quersummen_berechnen(gk1up&)
  10229.       GOSUB quersummen_berechnen(gk5up&)
  10230.       GOSUB quersummen_berechnen(zustup&)
  10231.     CASE swvon& ! Das Wort Streitwert angeklickt
  10232.       GOSUB unhide(gebuehrinfobaum_adr%,swgenau&)  ! Streitwertbox wieder zeigen
  10233.       GOSUB undo_obj(gebuehrinfobaum_adr%,swgenau&,8)  ! enabled
  10234.       GOSUB do_objc(gebuehrinfobaum_adr%,swgenau&,1)  ! selektieren
  10235.       GOSUB objc_update(gebuehrinfobaum_adr%,swgenau&)
  10236.       @editfeldeingaben(gebuehrinfobaum_adr%,swgenau&,11,TRUE)
  10237.       GOSUB werte_einsetzen
  10238.       IF demoversion%=TRUE AND VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swgenau&)}})>300000
  10239.         ex_obj%=abbruch& ! Gebührenrechner verlassen
  10240.         dummy%=@rsc_alert(1,"Geld_her 3.0 Demoversion|Gebührenrechner nur|bis DM 3000.-"," [OK ",1)
  10241.       ENDIF
  10242.     CASE swup&
  10243.       swgenau#=0  ! Weil jetzt wieder der Streitwertbereich Vorrang hat
  10244.       CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swgenau&)}}=""
  10245.       GOSUB do_objc(gebuehrinfobaum_adr%,swgenau&,8)  ! disabled
  10246.       GOSUB del_flag(gebuehrinfobaum_adr%,swgenau&,8)  ! Streitwertbox nicht editierbar
  10247.       erstes_objekt%=0 ! Cursor verstecken
  10248.       GOSUB objc_update(gebuehrinfobaum_adr%,swgenau&)
  10249.       REPEAT
  10250.         ' den vorherigen oberen Streitwert an die niederere Stelle schreiben
  10251.         swhoch$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swhoch&)}}
  10252.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swnieder&)}}=swhoch$
  10253.         ' die nächste Streitwertstufe suchen
  10254.         swnieder#=VAL(swhoch$)
  10255.         IF demoversion%=TRUE AND swnieder#>2400
  10256.           ex_obj%=abbruch& ! Gebührenrechner verlassen
  10257.           dummy%=@rsc_alert(1,"Geld_her 3.0 Demoversion|Gebührenrechner nur|bis DM 3000.-"," [OK ",1)
  10258.         ENDIF
  10259.         swnieder#=MIN(swnieder#,2.74E+08) ! nicht drüber
  10260.         IF swnieder#<=2400
  10261.           swhoch#=swnieder#+600
  10262.         ELSE IF swnieder#<=9000
  10263.           swhoch#=swnieder#+1000
  10264.         ELSE IF swnieder#<=18000
  10265.           swhoch#=swnieder#+2000
  10266.         ELSE IF swnieder#<=45000
  10267.           swhoch#=swnieder#+5000
  10268.         ELSE IF swnieder#<=90000
  10269.           swhoch#=swnieder#+10000
  10270.         ELSE IF swnieder#<=370000
  10271.           swhoch#=swnieder#+30000
  10272.         ELSE IF swnieder#<=940000
  10273.           swhoch#=swnieder#+60000
  10274.         ELSE IF swnieder#<=9.999E+08
  10275.           swhoch#=swnieder#+100000
  10276.         ENDIF
  10277.         swhoch#=MIN(swhoch#,2.75E+08) ! nicht drüber
  10278.         swhoch$=STR$(swhoch#,9)
  10279.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swhoch&)}}=swhoch$
  10280.         GOSUB objc_update(gebuehrinfobaum_adr%,swnieder&)
  10281.         GOSUB objc_update(gebuehrinfobaum_adr%,swhoch&)
  10282.         KEYTEST taste%
  10283.         REPEAT
  10284.         UNTIL INKEY$=""  ! Puffer löschen wg. Nachlaufen
  10285.       UNTIL MOUSEK=0 AND taste%=0
  10286.       GOSUB kosten_und_gebuehren_einsetzen(swhoch#)  ! swhoch liegt innerhalb
  10287.       ' der Gebührenzone, sw nieder 1 Pfennig darunter
  10288.       ' Alle Zeilen neu durchrechnen
  10289.       GOSUB quersummen_berechnen(up3&)
  10290.       GOSUB quersummen_berechnen(up5&)
  10291.       GOSUB quersummen_berechnen(up7&)
  10292.       GOSUB quersummen_berechnen(up10&)
  10293.       GOSUB quersummen_berechnen(up13&)
  10294.       GOSUB quersummen_berechnen(gk1up&)
  10295.       GOSUB quersummen_berechnen(gk5up&)
  10296.       GOSUB quersummen_berechnen(zustup&)
  10297.     CASE swdown&
  10298.       swgenau#=0  ! Weil jetzt wieder der Streitwertbereich Vorrang hat
  10299.       CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swgenau&)}}=""
  10300.       GOSUB do_objc(gebuehrinfobaum_adr%,swgenau&,8)  ! disabled
  10301.       GOSUB del_flag(gebuehrinfobaum_adr%,swgenau&,8)  ! Streitwertbox nicht editierbar
  10302.       erstes_objekt%=0 ! Cursor verstecken
  10303.       GOSUB objc_update(gebuehrinfobaum_adr%,swgenau&)
  10304.       REPEAT
  10305.         ' den vorherigen niederen Streitwert an die höhere Stelle schreiben
  10306.         swnieder$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swnieder&)}}
  10307.         swhoch#=VAL(swnieder$)
  10308.         swhoch#=MAX(600,swhoch#)
  10309.         swhoch$=STR$(swhoch#,9)
  10310.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swhoch&)}}=swhoch$
  10311.         ' die nächste Streitwertstufe suchen
  10312.         IF swhoch#<=3000
  10313.           swnieder#=swhoch#-600
  10314.         ELSE IF swhoch#<=10000
  10315.           swnieder#=swhoch#-1000
  10316.         ELSE IF swhoch#<=20000
  10317.           swnieder#=swhoch#-2000
  10318.         ELSE IF swhoch#<=50000
  10319.           swnieder#=swhoch#-5000
  10320.         ELSE IF swhoch#<=100000
  10321.           swnieder#=swhoch#-10000
  10322.         ELSE IF swhoch#<=400000
  10323.           swnieder#=swhoch#-30000
  10324.         ELSE IF swhoch#<=1E+06
  10325.           swnieder#=swhoch#-60000
  10326.         ELSE IF swhoch#<=9.999E+08
  10327.           swnieder#=swhoch#-100000
  10328.         ENDIF
  10329.         swnieder#=MAX(0,swnieder#)  ! nicht kleiner 0
  10330.         swnieder$=STR$(swnieder#,9)
  10331.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swnieder&)}}=swnieder$
  10332.         GOSUB objc_update(gebuehrinfobaum_adr%,swnieder&)
  10333.         GOSUB objc_update(gebuehrinfobaum_adr%,swhoch&)
  10334.         KEYTEST taste%
  10335.         REPEAT
  10336.         UNTIL INKEY$=""  ! Puffer löschen wg. Nachlaufen
  10337.       UNTIL MOUSEK=0 AND taste%=0
  10338.       GOSUB kosten_und_gebuehren_einsetzen(swhoch#)
  10339.       ' Alle Zeilen neu durchrechnen
  10340.       GOSUB quersummen_berechnen(up3&)
  10341.       GOSUB quersummen_berechnen(up5&)
  10342.       GOSUB quersummen_berechnen(up7&)
  10343.       GOSUB quersummen_berechnen(up10&)
  10344.       GOSUB quersummen_berechnen(up13&)
  10345.       GOSUB quersummen_berechnen(gk1up&)
  10346.       GOSUB quersummen_berechnen(gk5up&)
  10347.       GOSUB quersummen_berechnen(zustup&)
  10348.     CASE pkhja&,pkhnein&
  10349.       GOSUB kosten_und_gebuehren_einsetzen(swhoch#)
  10350.       ' Alle Zeilen neu durchrechnen
  10351.       GOSUB quersummen_berechnen(up3&)
  10352.       GOSUB quersummen_berechnen(up5&)
  10353.       GOSUB quersummen_berechnen(up7&)
  10354.       GOSUB quersummen_berechnen(up10&)
  10355.       GOSUB quersummen_berechnen(up13&)
  10356.       GOSUB quersummen_berechnen(gk1up&)
  10357.       GOSUB quersummen_berechnen(gk5up&)
  10358.       GOSUB quersummen_berechnen(zustup&)
  10359.     CASE up3&,up5&,up7&,up10&,up13&,gk1up&,gk5up&,zustup&
  10360.       REPEAT  ! solange Maustaste gedrückt ist, aber mindestens 1 mal
  10361.         faktor$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%-1)}}
  10362.         faktor#=MIN(VAL(faktor$)+1,9)  ! höchstens 9
  10363.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%-1)}}=STR$(faktor#)
  10364.         GOSUB objc_update(gebuehrinfobaum_adr%,ex_obj%-1)
  10365.         KEYTEST taste%
  10366.         REPEAT
  10367.         UNTIL INKEY$=""  ! Puffer löschen wg. Nachlaufen
  10368.         PAUSE 7
  10369.       UNTIL MOUSEK=0 AND taste%=0
  10370.     CASE mwstja&,mwstnein& ! Linie ziehen wg Gem-Fehler
  10371.     CASE upkm&
  10372.       faktor$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%-1)}}
  10373.       faktor#=VAL(faktor$)
  10374.       KEYLOOK taste%
  10375.       IF BIOS(11,-1) AND 3  ! Shift links oder rechts gedrückt
  10376.         schritt%=10
  10377.       ELSE
  10378.         schritt%=1
  10379.       ENDIF
  10380.       REPEAT  ! solange Maustaste gedrückt ist, aber mindestens 1 mal
  10381.         faktor#=MIN(faktor#+schritt%,99999)  ! höchstens 99999 km
  10382.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%-1)}}=STR$(faktor#,5)
  10383.         GOSUB objc_update(gebuehrinfobaum_adr%,ex_obj%-1)
  10384.         PAUSE 1 ! Da sonst schneller verarbeitet als wiederholt wird
  10385.         KEYTEST taste%
  10386.         REPEAT
  10387.         UNTIL INKEY$=""  ! Tasten-Puffer löschen
  10388.       UNTIL MOUSEK=0 AND taste%=0
  10389.     CASE upcopy&
  10390.       faktor$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%-1)}}
  10391.       faktor#=VAL(faktor$)
  10392.       KEYLOOK taste%
  10393.       IF BIOS(11,-1) AND 3  ! Shift links oder rechts gedrückt
  10394.         schritt%=10
  10395.       ELSE
  10396.         schritt%=1
  10397.       ENDIF
  10398.       REPEAT  ! solange Maustaste gedrückt ist, aber mindestens 1 mal
  10399.         faktor#=MIN(faktor#+schritt%,999)  ! höchstens 999 Kopien
  10400.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%-1)}}=STR$(faktor#,3)
  10401.         GOSUB objc_update(gebuehrinfobaum_adr%,ex_obj%-1)
  10402.         PAUSE 1 ! Da sonst schneller verarbeitet als wiederholt wird
  10403.         KEYTEST taste%
  10404.         REPEAT
  10405.         UNTIL INKEY$=""  ! Tasten-Puffer löschen
  10406.       UNTIL MOUSEK=0 AND taste%=0
  10407.     CASE down3&,down5&,down7&,down10&,down13&,gk1down&,gk5down&,zustdown&
  10408.       REPEAT  ! solange Maustaste gedrückt ist, aber mindestens 1 mal
  10409.         faktor$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%+2)}}
  10410.         faktor#=MAX(VAL(faktor$)-1,0)  ! mindestens 0
  10411.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%+2)}}=STR$(faktor#)
  10412.         GOSUB objc_update(gebuehrinfobaum_adr%,ex_obj%+2)
  10413.         KEYTEST taste%
  10414.         REPEAT
  10415.         UNTIL INKEY$=""  ! Puffer löschen wg. Nachlaufen
  10416.         PAUSE 7
  10417.       UNTIL MOUSEK=0 AND taste%=0
  10418.     CASE downcopy&
  10419.       faktor$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%+2)}}
  10420.       faktor#=VAL(faktor$)
  10421.       KEYLOOK taste%
  10422.       IF BIOS(11,-1) AND 3  ! Shift links oder rechts gedrückt
  10423.         schritt%=10
  10424.       ELSE
  10425.         schritt%=1
  10426.       ENDIF
  10427.       REPEAT  ! solange Maustaste gedrückt ist, aber mindestens 1 mal
  10428.         faktor#=MAX(faktor#-schritt%,0)
  10429.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%+2)}}=STR$(faktor#,3)
  10430.         GOSUB objc_update(gebuehrinfobaum_adr%,ex_obj%+2)
  10431.         PAUSE 1 ! Da sonst schneller verarbeitet als wiederholt wird
  10432.         KEYTEST taste%
  10433.         REPEAT
  10434.         UNTIL INKEY$=""  ! Tasten-Puffer löschen
  10435.       UNTIL MOUSEK=0 AND taste%=0
  10436.     CASE downkm&
  10437.       faktor$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%+2)}}
  10438.       faktor#=VAL(faktor$)
  10439.       faktor#=VAL(faktor$)
  10440.       KEYLOOK taste%
  10441.       IF BIOS(11,-1) AND 3  ! Shift links oder rechts gedrückt
  10442.         schritt%=10
  10443.       ELSE
  10444.         schritt%=1
  10445.       ENDIF
  10446.       REPEAT  ! solange Maustaste gedrückt ist, aber mindestens 1 mal
  10447.         faktor#=MAX(faktor#-schritt%,0)
  10448.         CHAR{{OB_SPEC(gebuehrinfobaum_adr%,ex_obj%+2)}}=STR$(faktor#,5)
  10449.         GOSUB objc_update(gebuehrinfobaum_adr%,ex_obj%+2)
  10450.         PAUSE 1 ! Da sonst schneller verarbeitet als wiederholt wird
  10451.         KEYTEST taste%
  10452.         REPEAT
  10453.         UNTIL INKEY$=""  ! Tasten-Puffer löschen
  10454.       UNTIL MOUSEK=0 AND taste%=0
  10455.     CASE proauslg&
  10456.       editfeldeingaben(gebuehrinfobaum_adr%,proauslg&,8,TRUE)
  10457.       proauslg$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,proauslg&)}}
  10458.       proauslg#=VAL(proauslg$)
  10459.       CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumverau&)}}=" "+proauslg$
  10460.       GOSUB objc_update(gebuehrinfobaum_adr%,sumverau&)
  10461.     CASE verauslg&
  10462.       editfeldeingaben(gebuehrinfobaum_adr%,verauslg&,16,FALSE)
  10463.       verauslg$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,verauslg&)}}
  10464.     CASE zuclipb&
  10465.       clipboard%=TRUE
  10466.       tastaturuebergabe%=FALSE
  10467.       GOSUB uebergabe
  10468.       GOSUB undo_obj(gebuehrinfobaum_adr%,ex_obj%,1)
  10469.       @objc_update(gebuehrinfobaum_adr%,zuclipb&)
  10470.     CASE abbruch&
  10471.       tastaturuebergabe%=FALSE
  10472.       clipboard%=FALSE
  10473.     ENDSELECT
  10474.     GOSUB quersummen_berechnen(ex_obj%)
  10475.     GOSUB gebuehrensummen_berechnen
  10476.     '
  10477.     ' KLICKBOX neu zeichnen
  10478.     IF ex_obj%>klickbox& AND ex_obj%<=verauslg&
  10479.       KEYLOOK gedrueckt%
  10480.       IF gedrueckt%=0
  10481.         GOSUB objc_update(gebuehrinfobaum_adr%,klickbox&)
  10482.       ENDIF
  10483.     ENDIF
  10484.   LOOP UNTIL ex_obj%=abbruch&  ! Bei Clipboard bleibt Dialog offen
  10485.   rsc_back(gebuehrinfobaum&)
  10486.   GOSUB undo_obj(gebuehrinfobaum_adr%,ex_obj%,1)
  10487.   GOSUB del_flag(gebuehrinfobaum_adr%,swgenau&,8)  ! Streitwertbox nicht editierbar
  10488.   GOSUB del_flag(gebuehrinfobaum_adr%,swgenau&,64)  ! Streitwertbox nicht touchexit
  10489.   @resource_einrichten(1)
  10490. RETURN
  10491. ' ****************************************************************
  10492. > PROCEDURE kosten_und_gebuehren_einsetzen(streitwert#)
  10493.   ' PKH oder normale Gebührensätze ?
  10494.   GOSUB is_objc(gebuehrinfobaum_adr%,pkhja&,1,*status%)
  10495.   IF status%=1  ! dann PKH-Sätze nehmen
  10496.     GOSUB pkh_gebuehrenermittlung(streitwert#,g3#,g5#,g7#,g10#,g13#)
  10497.   ELSE  ! sonst normale Gebühren
  10498.     GOSUB gebuehrenermittlung(streitwert#,ostwestfaktor#,g3#,g5#,g7#,g10#,g13#)
  10499.   ENDIF
  10500.   g3$=STR$(g3#*100,9) ! ohne nachkommastellen
  10501.   g5$=STR$(g5#*100,9)
  10502.   g7$=STR$(g7#*100,9)
  10503.   g10$=STR$(g10#*100,9)
  10504.   g13$=STR$(g13#*100,9)
  10505.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro3&)}}=g3$
  10506.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro5&)}}=g5$
  10507.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro7&)}}=g7$
  10508.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro10&)}}=g10$
  10509.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro13&)}}=g13$
  10510.   GOSUB objc_update(gebuehrinfobaum_adr%,pro3&)
  10511.   GOSUB objc_update(gebuehrinfobaum_adr%,pro5&)
  10512.   GOSUB objc_update(gebuehrinfobaum_adr%,pro7&)
  10513.   GOSUB objc_update(gebuehrinfobaum_adr%,pro10&)
  10514.   GOSUB objc_update(gebuehrinfobaum_adr%,pro13&)
  10515.   '
  10516.   ' Gerichtskosten
  10517.   GOSUB gerichtskostenermittlung(streitwert#,gk5#,gk1#)
  10518.   gk5$=STR$(gk5#*100,9) ! ohne nachkommastellen
  10519.   gk1$=STR$(gk1#*100,9)
  10520.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,progk1&)}}=gk1$
  10521.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,progk5&)}}=gk5$
  10522.   GOSUB objc_update(gebuehrinfobaum_adr%,progk1&)
  10523.   GOSUB objc_update(gebuehrinfobaum_adr%,progk5&)
  10524. RETURN
  10525. ' ***********************************************************
  10526. > PROCEDURE quersummen_berechnen(angeklicktes_objekt%)
  10527.   '
  10528.   fuell$="      000"
  10529.   SELECT angeklicktes_objekt%  ! nochmal selektieren zur Neuberechnung
  10530.   CASE up3&,down3&
  10531.     ' Faktor ermitteln
  10532.     faktor3#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor3&)}})
  10533.     IF faktor3#>0
  10534.       ' Multiplikator ermitteln
  10535.       pro3#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro3&)}})
  10536.       ' Summe ermitteln und einsetzen
  10537.       summe3#=faktor3#*pro3#
  10538.       summe3$=STR$(summe3#,9)
  10539.     ELSE
  10540.       summe3$=fuell$
  10541.     ENDIF
  10542.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe3&)}}=summe3$
  10543.     GOSUB objc_update(gebuehrinfobaum_adr%,summe3&)
  10544.   CASE up5&,down5&
  10545.     ' Faktor ermitteln
  10546.     faktor5#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor5&)}})
  10547.     IF faktor5#>0
  10548.       ' Multiplikator ermitteln
  10549.       pro5#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro5&)}})
  10550.       ' Summe ermitteln und einsetzen
  10551.       summe5#=faktor5#*pro5#
  10552.       summe5$=STR$(summe5#,9)
  10553.     ELSE
  10554.       summe5$=fuell$
  10555.     ENDIF
  10556.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe5&)}}=summe5$
  10557.     GOSUB objc_update(gebuehrinfobaum_adr%,summe5&)
  10558.   CASE up7&,down7&
  10559.     ' Faktor ermitteln
  10560.     faktor7#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor7&)}})
  10561.     IF faktor7#>0
  10562.       ' Multiplikator ermitteln
  10563.       pro7#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro7&)}})
  10564.       ' Summe ermitteln und einsetzen
  10565.       summe7#=faktor7#*pro7#
  10566.       summe7$=STR$(summe7#,9)
  10567.     ELSE
  10568.       summe7$=fuell$
  10569.     ENDIF
  10570.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe7&)}}=summe7$
  10571.     GOSUB objc_update(gebuehrinfobaum_adr%,summe7&)
  10572.   CASE up10&,down10&
  10573.     ' Faktor ermitteln
  10574.     faktor10#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor10&)}})
  10575.     IF faktor10#>0
  10576.       ' Multiplikator ermitteln
  10577.       pro10#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro10&)}})
  10578.       ' Summe ermitteln und einsetzen
  10579.       summe10#=faktor10#*pro10#
  10580.       summe10$=STR$(summe10#,9)
  10581.     ELSE
  10582.       summe10$=fuell$
  10583.     ENDIF
  10584.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe10&)}}=summe10$
  10585.     GOSUB objc_update(gebuehrinfobaum_adr%,summe10&)
  10586.   CASE up13&,down13&
  10587.     ' Faktor ermitteln
  10588.     faktor13#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktor13&)}})
  10589.     IF faktor13#>0
  10590.       ' Multiplikator ermitteln
  10591.       pro13#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,pro13&)}})
  10592.       ' Summe ermitteln und einsetzen
  10593.       summe13#=faktor13#*pro13#
  10594.       summe13$=STR$(summe13#,9)
  10595.     ELSE
  10596.       summe13$=fuell$
  10597.     ENDIF
  10598.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summe13&)}}=summe13$
  10599.     GOSUB objc_update(gebuehrinfobaum_adr%,summe13&)
  10600.   CASE upcopy&,downcopy&
  10601.     ' Faktor ermitteln
  10602.     faktcopy#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktcopy&)}})
  10603.     ' Multiplikator: bis 50 Kopien DM 1, drüber DM 0.30
  10604.     ' Summe ermitteln und einsetzen
  10605.     SELECT faktcopy#
  10606.     CASE 0
  10607.       sumcopy$=fuell$
  10608.     CASE 1 TO 50
  10609.       sumcopy#=faktcopy#*100 ! ohne nachkommastellen
  10610.       sumcopy$=STR$(sumcopy#,9)
  10611.     CASE 51 TO 999
  10612.       sumcopy#=5000+30*(faktcopy#-50)
  10613.       sumcopy$=STR$(sumcopy#,9)
  10614.     ENDSELECT
  10615.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumcopy&)}}=sumcopy$
  10616.     GOSUB objc_update(gebuehrinfobaum_adr%,sumcopy&)
  10617.   CASE upkm&,downkm&
  10618.     ' Faktor ermitteln
  10619.     faktkm#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktkm&)}})
  10620.     ' Multiplikator: 52 Pfennig
  10621.     ' Summe ermitteln und einsetzen
  10622.     IF faktkm#>0
  10623.       sumkm#=faktkm#*52 ! ohne nachkommastellen
  10624.       sumkm$=STR$(sumkm#,9)
  10625.     ELSE
  10626.       sumkm#=0
  10627.       sumkm$=fuell$
  10628.     ENDIF
  10629.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumkm&)}}=sumkm$
  10630.     GOSUB objc_update(gebuehrinfobaum_adr%,sumkm&)
  10631.   CASE mwstja&,mwstnein&
  10632.     GOSUB gebuehrensummen_berechnen
  10633.   CASE gk1up&,gk1down&
  10634.     ' Faktor ermitteln
  10635.     faktgk1#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktgk1&)}})
  10636.     IF faktgk1#>0
  10637.       ' Multiplikator ermitteln
  10638.       progk1#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,progk1&)}})
  10639.       ' Summe ermitteln und einsetzen
  10640.       summegk1#=faktgk1#*progk1# ! ohne nachkommastellen da auch progk ohne nachkomma
  10641.       summegk1$=STR$(summegk1#,9)
  10642.     ELSE
  10643.       summegk1$=fuell$
  10644.     ENDIF
  10645.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summegk1&)}}=summegk1$
  10646.     GOSUB objc_update(gebuehrinfobaum_adr%,summegk1&)
  10647.   CASE gk5up&,gk5down&
  10648.     ' Faktor ermitteln
  10649.     faktgk5#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktgk5&)}})
  10650.     IF faktgk5#>0
  10651.       ' Multiplikator ermitteln
  10652.       progk5#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,progk5&)}})
  10653.       ' Summe ermitteln und einsetzen
  10654.       summegk5#=faktgk5#*progk5# ! ohne nachkommastellen da auch progk ohne nachkomma
  10655.       summegk5$=STR$(summegk5#,9)
  10656.     ELSE
  10657.       summegk5$=fuell$
  10658.     ENDIF
  10659.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summegk5&)}}=summegk5$
  10660.     GOSUB objc_update(gebuehrinfobaum_adr%,summegk5&)
  10661.   CASE zustup&,zustdown&
  10662.     ' Faktor ermitteln
  10663.     faktzust#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,faktzust&)}})
  10664.     IF faktzust#>0
  10665.       ' Multiplikator ermitteln ist überflüssig er ist die
  10666.       ' globale Variable gkzust (oben eingesetzt)
  10667.       sumzust#=faktzust#*gkzust#*100 ! ohne nachkommastellen
  10668.       sumzust$=STR$(sumzust#,9)
  10669.     ELSE
  10670.       sumzust$=fuell$
  10671.     ENDIF
  10672.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumzust&)}}=sumzust$
  10673.     GOSUB objc_update(gebuehrinfobaum_adr%,sumzust&)
  10674.   ENDSELECT
  10675. RETURN
  10676. ' ******************************************************************
  10677. > PROCEDURE gebuehrensummen_berechnen
  10678.   wert#=0
  10679.   ' 3/10 Gebühren
  10680.   GOSUB summen_lesen(gebuehrinfobaum_adr%,summe3&,dummy#)
  10681.   ADD wert#,dummy#
  10682.   ' 5/10 Gebühren
  10683.   GOSUB summen_lesen(gebuehrinfobaum_adr%,summe5&,dummy#)
  10684.   ADD wert#,dummy#
  10685.   ' 7,5/10 Gebühren
  10686.   GOSUB summen_lesen(gebuehrinfobaum_adr%,summe7&,dummy#)
  10687.   ADD wert#,dummy#
  10688.   ' 10/10 Gebühren
  10689.   GOSUB summen_lesen(gebuehrinfobaum_adr%,summe10&,dummy#)
  10690.   ADD wert#,dummy#
  10691.   ' 13/10 Gebühren
  10692.   GOSUB summen_lesen(gebuehrinfobaum_adr%,summe13&,dummy#)
  10693.   ADD wert#,dummy#
  10694.   '
  10695.   ' Auslagenpauschale
  10696.   IF wert#>0
  10697.     sumauslg#=INT((wert#*0.15+9)/10)*10
  10698.     sumauslg#=MIN(sumauslg#,4000)  ! Höchstens DM 40.-
  10699.     sumauslg$=STR$(sumauslg#,9)
  10700.   ELSE
  10701.     sumauslg#=0
  10702.     sumauslg$="      000"
  10703.   ENDIF
  10704.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,sumauslg&)}}=sumauslg$
  10705.   GOSUB objc_update(gebuehrinfobaum_adr%,sumauslg&)
  10706.   ADD wert#,sumauslg#
  10707.   '
  10708.   ' Kopien
  10709.   GOSUB summen_lesen(gebuehrinfobaum_adr%,sumcopy&,dummy#)
  10710.   ADD wert#,dummy#
  10711.   ' Kilometer
  10712.   GOSUB summen_lesen(gebuehrinfobaum_adr%,sumkm&,dummy#)
  10713.   ADD wert#,dummy#
  10714.   '
  10715.   ' Zwischensumme vor MwSt bilden
  10716.   IF wert#>0
  10717.     wert$=STR$(wert#,9)
  10718.   ELSE
  10719.     wert$="      000"
  10720.   ENDIF
  10721.   summevormwst#=wert#
  10722.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,zwisumme&)}}=wert$
  10723.   GOSUB objc_update(gebuehrinfobaum_adr%,zwisumme&)
  10724.   '
  10725.   ' MwSt berechnen und einsetzen
  10726.   GOSUB is_objc(gebuehrinfobaum_adr%,mwstja&,1,*status%) ! Mwstja gewählt
  10727.   IF status%=1
  10728.     summwst#=ROUND(wert#*mwstsatz#/100)  !mwstsatz ist eine globale Variable
  10729.     summwst$=STR$(summwst#,9)
  10730.     ADD wert#,summwst#
  10731.     IF summwst#=0
  10732.       summwst$="      000"
  10733.     ENDIF
  10734.   ELSE
  10735.     summwst$="      000"
  10736.     summwst#=0
  10737.   ENDIF
  10738.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,summwst&)}}=summwst$
  10739.   GOSUB objc_update(gebuehrinfobaum_adr%,summwst&)
  10740.   summenachmwst#=wert#
  10741.   '
  10742.   ' 10/10 Gerichtskosten
  10743.   GOSUB summen_lesen(gebuehrinfobaum_adr%,summegk1&,dummy#)
  10744.   ADD wert#,dummy#
  10745.   '
  10746.   ' 5/10 Gerichtskosten
  10747.   GOSUB summen_lesen(gebuehrinfobaum_adr%,summegk5&,dummy#)
  10748.   ADD wert#,dummy#
  10749.   '
  10750.   ' Zustellkosten
  10751.   GOSUB summen_lesen(gebuehrinfobaum_adr%,sumzust&,dummy#)
  10752.   ADD wert#,dummy#
  10753.   '
  10754.   ' Verauslagungen ohne MwSt
  10755.   GOSUB summen_lesen(gebuehrinfobaum_adr%,sumverau&,dummy#)
  10756.   ADD wert#,dummy#
  10757.   '
  10758.   ' GESAMTSUMME einsetzen
  10759.   gesamtsumme#=wert#
  10760.   IF wert#>0
  10761.     wert$=STR$(wert#,10)
  10762.   ELSE
  10763.     wert$="       000"
  10764.   ENDIF
  10765.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,gessumme&)}}=wert$
  10766.   GOSUB objc_update(gebuehrinfobaum_adr%,gessumme&)
  10767. RETURN
  10768. ' ******************************************************************
  10769. > PROCEDURE summen_lesen(tree%,index&,VAR r#)
  10770.   r#=VAL(CHAR{{OB_SPEC(gebuehrinfobaum_adr%,index&)}})
  10771. RETURN
  10772. ' *********************************************************
  10773. > PROCEDURE editfeldeingaben(tree%,obj%,laenge%,nurzahlen%)
  10774.   @do_objc(tree%,obj%,1)
  10775.   '   ! Objekt als Zeichen zur Eingabebereitschaft invers
  10776.   GOSUB objc_update(tree%,obj%)
  10777.   eing$=""
  10778.   DO
  10779.     KEYGET a%
  10780.     a%=BYTE(a%)
  10781.     SELECT a%
  10782.     CASE 8  ! Backspace
  10783.       l%=LEN(eing$)
  10784.       eing$=LEFT$(eing$,MAX(l%-1,0))
  10785.     CASE 27  ! Escape
  10786.       eing$=""
  10787.     CASE 48 TO 57 ! 0 bis 9
  10788.       eing$=LEFT$(eing$+CHR$(a%),laenge%)
  10789.     CASE 32 TO 47,58 TO 255
  10790.       IF nurzahlen%=FALSE
  10791.         eing$=LEFT$(eing$+CHR$(a%),laenge%)  ! auch Buchstaben
  10792.       ENDIF
  10793.     ENDSELECT
  10794.     EXIT IF a%=13  !Return
  10795.     IF nurzahlen%=TRUE
  10796.       @dm_zahlen_einsetzen(tree%,obj%,VAL(eing$)/100,laenge%)
  10797.     ELSE
  10798.       CHAR{{OB_SPEC(tree%,obj%)}}=eing$
  10799.     ENDIF
  10800.     GOSUB objc_update(tree%,obj%)
  10801.   LOOP
  10802.   GOSUB undo_obj(tree%,obj%,1)
  10803.   GOSUB objc_update(tree%,obj%)
  10804. RETURN
  10805. ' ***************************************************
  10806. > PROCEDURE werte_einsetzen
  10807.   swgenau$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swgenau&)}}
  10808.   swgenau#=VAL(swgenau$)/100
  10809.   IF swgenau#>2.75E+08
  10810.     ~@rsc_alert(1,"Streitwerte nur bis|275 Mio. DM !"," [OK ",1)
  10811.     swgenau#=2.75E+08
  10812.     CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swgenau&)}}="27500000000"
  10813.     @objc_update(gebuehrinfobaum_adr%,swgenau&)
  10814.   ENDIF
  10815.   SUB swgenau#,0.01  ! Damit die Gebührenbereiche stimmen
  10816.   swgenau#=MAX(swgenau#,0)
  10817.   IF swgenau#<=3000
  10818.     swnieder#=INT(swgenau#/600)*600
  10819.     swhoch#=swnieder#+600
  10820.   ELSE IF swgenau#<=10000
  10821.     swnieder#=INT((swgenau#-3000)/1000)*1000+3000
  10822.     swhoch#=swnieder#+1000
  10823.   ELSE IF swgenau#<=20000
  10824.     swnieder#=INT((swgenau#-10000)/2000)*2000+10000
  10825.     swhoch#=swnieder#+2000
  10826.   ELSE IF swgenau#<=50000
  10827.     swnieder#=INT((swgenau#-20000)/5000)*5000+20000
  10828.     swhoch#=swnieder#+5000
  10829.   ELSE IF swgenau#<=100000
  10830.     swnieder#=INT((swgenau#-50000)/10000)*10000+50000
  10831.     swhoch#=swnieder#+10000
  10832.   ELSE IF swgenau#<=400000
  10833.     swnieder#=INT((swgenau#-100000)/30000)*30000+100000
  10834.     swhoch#=swnieder#+30000
  10835.   ELSE IF swgenau#<=1E+06
  10836.     swnieder#=INT((swgenau#-400000)/60000)*60000+400000
  10837.     swhoch#=swnieder#+60000
  10838.   ELSE IF swgenau#<=9.999E+08
  10839.     swnieder#=INT((swgenau#-1E+06)/100000)*100000+1E+06
  10840.     swhoch#=swnieder#+100000
  10841.   ENDIF
  10842.   swnieder$=STR$(swnieder#,9)
  10843.   swhoch#=MIN(swhoch#,2.75E+08) ! nicht drüber
  10844.   swhoch$=STR$(swhoch#,9)
  10845.   ADD swgenau#,0.01  ! Wiederherstellen
  10846.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swnieder&)}}=swnieder$
  10847.   CHAR{{OB_SPEC(gebuehrinfobaum_adr%,swhoch&)}}=swhoch$
  10848.   GOSUB objc_update(gebuehrinfobaum_adr%,swnieder&)
  10849.   GOSUB objc_update(gebuehrinfobaum_adr%,swhoch&)
  10850.   GOSUB kosten_und_gebuehren_einsetzen(swhoch#)  ! swhoch liegt innerhalb
  10851.   ' der Gebührenzone, sw nieder 1 Pfennig darunter
  10852.   ' Alle Zeilen neu durchrechnen
  10853.   GOSUB quersummen_berechnen(up3&)
  10854.   GOSUB quersummen_berechnen(up5&)
  10855.   GOSUB quersummen_berechnen(up7&)
  10856.   GOSUB quersummen_berechnen(up10&)
  10857.   GOSUB quersummen_berechnen(up13&)
  10858.   GOSUB quersummen_berechnen(gk1up&)
  10859.   GOSUB quersummen_berechnen(gk5up&)
  10860.   GOSUB quersummen_berechnen(zustup&)
  10861. RETURN
  10862. ' ********************************************************++
  10863. > PROCEDURE uebergabe
  10864.   GOSUB felder_besetzen
  10865.   GOSUB felder_vorbereiten
  10866.   GOSUB clipboardpfad_finden
  10867.   GOSUB clipboard_schreiben
  10868. RETURN
  10869. ' **********************************************************
  10870. > PROCEDURE felder_besetzen
  10871.   ausgabezeile%=0  ! Rücksetzen; Zeile Startet bei null, max=40
  10872.   '
  10873.   ' Streitwertangabe
  10874.   IF gesamtsumme#>0
  10875.     ausgabe$(ausgabezeile%)="Streitwert/Geschäftswert "
  10876.     IF swgenau#=0
  10877.       ausgabe$(ausgabezeile%)=ausgabe$(ausgabezeile%)+"von DM "+@dez_komma$(swnieder#+0.01,0,2,TRUE)+" bis DM "+@dez_komma$(swhoch#,0,2,TRUE)
  10878.     ELSE
  10879.       ausgabe$(ausgabezeile%)=ausgabe$(ausgabezeile%)+@dez_komma$(swgenau#,0,2,TRUE)
  10880.     ENDIF
  10881.     INC ausgabezeile%
  10882.   ENDIF
  10883.   IF ostwestfaktor#<0.9
  10884.     ausgabe$(ausgabezeile%)="Gebühren nach BRAGO - Ost"
  10885.     ausgabebetraege#(ausgabezeile%)=0
  10886.     INC ausgabezeile%
  10887.   ENDIF
  10888.   '
  10889.   ' Angabe, ob PKH-Tabelle
  10890.   GOSUB is_objc(gebuehrinfobaum_adr%,pkhja&,1,*status%)
  10891.   IF status%=1
  10892.     ausgabe$(ausgabezeile%)="Gebühren nach PKH-Tabelle"
  10893.     ausgabebetraege#(ausgabezeile%)=0
  10894.     INC ausgabezeile%
  10895.   ENDIF
  10896.   '
  10897.   ' 13/10 Gebühren
  10898.   FOR i%=0 TO faktor13#-1
  10899.     ausgabe$(ausgabezeile%)=gebuehrentexte$(4,i%)
  10900.     ausgabebetraege#(ausgabezeile%)=pro13#
  10901.     INC ausgabezeile%
  10902.   NEXT i%
  10903.   '
  10904.   ' 10/10 Gebühren
  10905.   FOR i%=0 TO faktor10#-1
  10906.     ausgabe$(ausgabezeile%)=gebuehrentexte$(3,i%)
  10907.     ausgabebetraege#(ausgabezeile%)=pro10#
  10908.     INC ausgabezeile%
  10909.   NEXT i%
  10910.   '
  10911.   ' 7,5/10 Gebühren
  10912.   FOR i%=0 TO faktor7#-1
  10913.     ausgabe$(ausgabezeile%)=gebuehrentexte$(2,i%)
  10914.     ausgabebetraege#(ausgabezeile%)=pro7#
  10915.     INC ausgabezeile%
  10916.   NEXT i%
  10917.   '
  10918.   ' 5/10 Gebühren
  10919.   FOR i%=0 TO faktor5#-1
  10920.     ausgabe$(ausgabezeile%)=gebuehrentexte$(1,i%)
  10921.     ausgabebetraege#(ausgabezeile%)=pro5#
  10922.     INC ausgabezeile%
  10923.   NEXT i%
  10924.   '
  10925.   ' 3/10 Gebühren
  10926.   FOR i%=0 TO faktor3#-1
  10927.     ausgabe$(ausgabezeile%)=gebuehrentexte$(0,i%)
  10928.     ausgabebetraege#(ausgabezeile%)=pro3#
  10929.     INC ausgabezeile%
  10930.   NEXT i%
  10931.   '
  10932.   ' Auslagenpauschale
  10933.   IF sumauslg#>0
  10934.     ausgabe$(ausgabezeile%)=gebuehrentexte$(5,0)
  10935.     ausgabebetraege#(ausgabezeile%)=sumauslg#
  10936.     INC ausgabezeile%
  10937.   ENDIF
  10938.   '
  10939.   ' Kopien
  10940.   IF faktcopy#>0
  10941.     ausgabe$(ausgabezeile%)=STR$(faktcopy#)+gebuehrentexte$(5,1)
  10942.     ausgabebetraege#(ausgabezeile%)=sumcopy#
  10943.     INC ausgabezeile%
  10944.   ENDIF
  10945.   '
  10946.   ' Kilometer
  10947.   IF faktkm#>0
  10948.     ausgabe$(ausgabezeile%)=STR$(faktkm#)+gebuehrentexte$(5,2)
  10949.     ausgabebetraege#(ausgabezeile%)=sumkm#
  10950.     INC ausgabezeile%
  10951.   ENDIF
  10952.   '
  10953.   ' Zwischensumme vor MwSt (nur wenn mit MwSt)
  10954.   GOSUB is_objc(gebuehrinfobaum_adr%,mwstja&,1,*status%)
  10955.   IF status%=1 AND summevormwst#>0
  10956.     ausgabe$(ausgabezeile%)=gebuehrentexte$(5,3)
  10957.     ausgabebetraege#(ausgabezeile%)=INT(summevormwst#)
  10958.     INC ausgabezeile%
  10959.   ENDIF
  10960.   '
  10961.   ' MwSt
  10962.   GOSUB is_objc(gebuehrinfobaum_adr%,mwstja&,1,*status%)
  10963.   IF status%=1 AND summwst#>0
  10964.     ausgabe$(ausgabezeile%)=STR$(mwstsatz#)+gebuehrentexte$(5,4)
  10965.     ausgabebetraege#(ausgabezeile%)=INT(summwst#)
  10966.     INC ausgabezeile%
  10967.   ENDIF
  10968.   '
  10969.   ' Summe nach MwSt immer ausgeben wenn überhaupt was rauskommt
  10970.   IF summenachmwst#>0 AND gesamtsumme#<>summenachmwst#
  10971.     ausgabe$(ausgabezeile%)=gebuehrentexte$(5,5)
  10972.     ausgabebetraege#(ausgabezeile%)=INT(summenachmwst#)
  10973.     INC ausgabezeile%
  10974.   ENDIF
  10975.   '
  10976.   ' volle Gerichtskostengebühreneinheiten
  10977.   IF faktgk1#>0
  10978.     ausgabe$(ausgabezeile%)=STR$(faktgk1#)+gebuehrentexte$(5,6)
  10979.     ausgabebetraege#(ausgabezeile%)=summegk1#
  10980.     INC ausgabezeile%
  10981.   ENDIF
  10982.   '
  10983.   ' halbe Gerichtskostengebühreneinheiten
  10984.   IF faktgk5#>0
  10985.     ausgabe$(ausgabezeile%)=STR$(faktgk5#)+gebuehrentexte$(5,7)
  10986.     ausgabebetraege#(ausgabezeile%)=summegk5#
  10987.     INC ausgabezeile%
  10988.   ENDIF
  10989.   '
  10990.   ' Zustellkosten
  10991.   IF faktzust#>0
  10992.     ausgabe$(ausgabezeile%)=STR$(faktzust#)+gebuehrentexte$(5,8)
  10993.     ausgabebetraege#(ausgabezeile%)=sumzust#
  10994.     INC ausgabezeile%
  10995.   ENDIF
  10996.   '
  10997.   ' Verauslagungen
  10998.   IF proauslg#>0
  10999.     verauslg$=CHAR{{OB_SPEC(gebuehrinfobaum_adr%,verauslg&)}}
  11000.     ausgabe$(ausgabezeile%)=TRIM$(verauslg$)
  11001.     ausgabebetraege#(ausgabezeile%)=proauslg#
  11002.     INC ausgabezeile%
  11003.   ENDIF
  11004.   IF gesamtsumme#>0
  11005.     ausgabe$(ausgabezeile%)=gebuehrentexte$(5,9)
  11006.     ausgabebetraege#(ausgabezeile%)=INT(gesamtsumme#)
  11007.     INC ausgabezeile%
  11008.   ENDIF
  11009.   DEC ausgabezeile% ! dadurch bezeichnet sie die letzte Zeile
  11010. RETURN
  11011. ' ********************************************************
  11012. > PROCEDURE felder_vorbereiten
  11013.   ' wenn TAB nicht definiert ist, mit Leerzeichen auffüllen
  11014.   IF tabtaste#=0 OR clipboard%=TRUE ! Aufs Clipboard ohne Tabtaste, nur Ascii
  11015.     ' Maximallänge der Texte feststellen
  11016.     l_max%=0
  11017.     FOR i%=1 TO ausgabezeile%  ! in 0 steht der Streitwert
  11018.       l_max%=MAX(LEN(ausgabe$(i%)),l_max%)
  11019.     NEXT i%
  11020.     FOR i%=1 TO ausgabezeile%  ! in zeile 0 steht der Streitwert
  11021.       l_aktuell%=LEN(ausgabe$(i%))
  11022.       IF l_aktuell%<l_max%
  11023.         ausgabe$(i%)=ausgabe$(i%)+SPACE$(l_max%-l_aktuell%)
  11024.       ENDIF
  11025.     NEXT i%
  11026.     ' Nun sind alle Texte gleichlang
  11027.     '
  11028.     ' "DM" und Beträge dazusetzen
  11029.     FOR i%=1 TO ausgabezeile%  ! in Zeile 0 steht der Streitwert
  11030.       IF ausgabebetraege#(i%)>0  ! nicht der Hinweis auf PKH-Tabelle
  11031.         x$=@dez_komma$(ausgabebetraege#(i%)/100,12,2,TRUE)
  11032.         ausgabe$(i%)=ausgabe$(i%)+" DM"+x$  ! Länge immer 15
  11033.       ENDIF
  11034.     NEXT i%
  11035.     '
  11036.   ELSE  ! es soll mit TAB-Tastenzeichen ausgegeben werden
  11037.     ' Also Felder so kurz lassen wie sie sind
  11038.   ENDIF
  11039.   '
  11040. RETURN
  11041. ' ****************************************************************
  11042. > FUNCTION dez_komma$(zahl#,l%,nk%,tpunkt%)
  11043.   ' Parameter sind: Zahl, gewünschte Gesamtlänge(rechtsbündiges Einsetzen),
  11044.   ' Nachkommastellen und Tpunkt wenn Tausendertrennpunkte gewünscht sind
  11045.   LOCAL a$,b$,i&
  11046.   '
  11047.   ' Vorkommazahl
  11048.   a%=INT(zahl#)
  11049.   a$=STR$(a%)
  11050.   IF tpunkt%=TRUE  ! mit Tausendertrennpunkt
  11051.     b$=""
  11052.     FOR i&=LEN(a$)-3 TO 1 STEP -3
  11053.       b$="."+MID$(a$,SUCC(i&),3)+b$
  11054.     NEXT i&
  11055.     b$=LEFT$(a$,(i&+3))+b$
  11056.   ELSE  ! ohne Tausendertrennpunkte
  11057.     b$=a$
  11058.   ENDIF
  11059.   '
  11060.   ' Nachkommateil
  11061.   IF nk%>0    ! Feste Länge an Nachkommastellen gewünscht
  11062.     dummy$=STR$(INT(FRAC(zahl#)*10^nk%+0.1))  ! + 0.1 wegen Rechenfehler des BASIC
  11063.     IF LEN(dummy$)<nk%
  11064.       FOR i&=1 TO nk%-LEN(dummy$)
  11065.         dummy$="0"+dummy$  ! Auffüllen des Nachkommaanteils
  11066.       NEXT i&
  11067.     ENDIF
  11068.     b$=b$+","+dummy$
  11069.   ELSE IF FRAC(zahl#)<>0
  11070.     b$=b$+","+MID$(STR$(FRAC(zahl#)),3)  ! wg format 0.032
  11071.   ELSE  ! Nachkommanteil ist Null
  11072.     dummy$=""
  11073.   ENDIF
  11074.   '
  11075.   ' Längenformatierung
  11076.   IF l%>=LEN(b$) ! Gesamtlänge angegeben, größer als Stringlänge, also auffüllen
  11077.     b$=SPACE$(l%-LEN(b$))+b$
  11078.   ELSE IF l%>0  ! Gesamtlänge angegeben, String wäre aber noch länger
  11079.     ' also stutzen und markieren oder evtl. rekursiv ohne tpkt aufrufen
  11080.     b$="#"+RIGHT$(b$,l%-1)
  11081.   ENDIF
  11082.   RETURN b$
  11083. ENDFUNC
  11084. ' ***************************************************************
  11085. > PROCEDURE clipboard_schreiben
  11086.   OPEN "O",#1,clipboarddateiname$
  11087.   FOR i%=0 TO ausgabezeile%
  11088.     PRINT #1,ausgabe$(i%)
  11089.   NEXT i%
  11090.   CLOSE #1
  11091.   back#=SCRP_WRITE(clipboardpfad$)  ! anderen Anwendungen mitteilen
  11092. RETURN
  11093. ' ********************************************************
  11094. > PROCEDURE inf_laden(standard%)
  11095.   IF standard%=TRUE
  11096.     inf_name$=boot_pfad$+"\PRT\GEBÜHREN.RCH\GEBRECH.INF"
  11097.   ELSE
  11098.     pfad$=boot_pfad$+"\PRT\GEBÜHREN.RCH\*.INF"
  11099.     inf_name$=@fileselect$("INF-Datei laden",pfad$,"GEBRECH.INF")
  11100.   ENDIF
  11101.   IF EXIST(inf_name$)
  11102.     FOR i%=0 TO 5
  11103.       FOR j%=0 TO 10
  11104.         gebuehrentexte$(i%,j%)=""
  11105.       NEXT j%
  11106.     NEXT i%
  11107.     FOR i%=0 TO 40
  11108.       ausgabebetraege#(40)=0
  11109.       ausgabe$(40)=""
  11110.     NEXT i%
  11111.     OPEN "I",#1,inf_name$
  11112.     ' Für 3/10 Gebühren
  11113.     GOSUB gebuehrentexte_laden(0)
  11114.     ' Für 5/10 Gebühren
  11115.     GOSUB gebuehrentexte_laden(1)
  11116.     ' Für 7,5/10 Gebühren
  11117.     GOSUB gebuehrentexte_laden(2)
  11118.     ' Für 10/10 Gebühren
  11119.     GOSUB gebuehrentexte_laden(3)
  11120.     ' Für 13/10 Gebühren
  11121.     GOSUB gebuehrentexte_laden(4)
  11122.     ' Für Zusatztexte (Auslagen, MwSt, Summen usw.)
  11123.     GOSUB gebuehrentexte_laden(5)
  11124.     CLOSE #1
  11125.   ELSE
  11126.     ~@rsc_alert(1,"Gebührenrechner-INF-Datei| wurde nicht gefunden"," [OK ",1)
  11127.   ENDIF
  11128.   inf_string$=MID$(inf_name$,RINSTR(inf_name$,"\")+1)
  11129.   inf_string$=SPACE$(12-LEN(inf_string$))+inf_string$
  11130.   CHAR{{OB_SPEC(rsc_adr%(gebuehrinfobaum&),infdatei&)}}=inf_string$
  11131.   IF standard%=FALSE ! sonst Box noch nicht sichtbar
  11132.     GOSUB objc_update(gebuehrinfobaum_adr%,infdatei&)
  11133.   ENDIF
  11134. RETURN
  11135. ' *******************************************************
  11136. > PROCEDURE gebuehrentexte_laden(index1%)
  11137.   FOR i%=0 TO 10
  11138.     INPUT #1,a$
  11139.     EXIT IF a$="***"
  11140.     gebuehrentexte$(index1%,i%)=a$
  11141.   NEXT i%
  11142. RETURN
  11143. ' **************************************************************
  11144. '
  11145. '
  11146. ' ================================================================
  11147. ' DRUCKERSTEUERUNG + AUSGABEUMWANDLUNG
  11148. ' =================================================================
  11149. ' ****************************************************************
  11150. > PROCEDURE druckeranpassung
  11151.   @resource_einrichten(2)
  11152.   druckanpbaum_adr%=rsc_adr%(druckanpbaum&)
  11153.   @dialog_positionieren(druckanpbaum&)
  11154.   vorherige_wahl%=pgrossae& ! für ersten Durchlauf
  11155.   FOR i%=grossae& TO overlayaufruf&
  11156.     @select(druckanpbaum_adr%,vorherige_wahl%,FALSE)  ! deselektieren
  11157.   NEXT i%
  11158.   @select(druckanpbaum_adr%,pgrossae&,TRUE)  ! Vorwahl Grossae
  11159.   CHAR{{OB_SPEC(druckanpbaum_adr%,drname&)}}=druckername$
  11160.   CHAR{{OB_SPEC(druckanpbaum_adr%,pbefehl&)}}=""
  11161.   GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,grossae$)
  11162.   vorherige_wahl%=pgrossae&
  11163.   ' ++++++++
  11164.   ' Vorbereitung des Dialogs
  11165.   rsc_draw(druckanpbaum&,fensterdial%)
  11166.   '
  11167.   DO
  11168.     ex_obj%=@rsc_do(druckanpbaum&,pbefehl&,dummy&)  ! dummy, da kein Popupmenu in der Box
  11169.     EXIT IF ex_obj%=pabbruch& ! Dann sofort raus, andernfalls das Zeichen übernehmen
  11170.     ' BEI AUSGANG DAS AKTUELLE STEUERZEICHEN LESEN UND ZUWEISEN
  11171.     SELECT vorherige_wahl%
  11172.     CASE pgrossae&
  11173.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,grossae$,dummy%)
  11174.     CASE pgrossoe&
  11175.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,grossoe$,dummy%)
  11176.     CASE pgrossue&
  11177.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,grossue$,dummy%)
  11178.     CASE pkleinae&
  11179.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,kleinae$,dummy%)
  11180.     CASE pkleinoe&
  11181.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,kleinoe$,dummy%)
  11182.     CASE pkleinue&
  11183.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,kleinue$,dummy%)
  11184.     CASE psz&
  11185.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,sz$,dummy%)
  11186.     CASE pparagr&
  11187.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,paragraph$,dummy%)
  11188.     CASE pcpi10&
  11189.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,cpi10$,dummy%)
  11190.     CASE pcpi12&
  11191.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,cpi12$,dummy%)
  11192.     CASE pcpi15&
  11193.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,cpi15$,dummy%)
  11194.     CASE pinitial&
  11195.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,initialisierung$,dummy%)
  11196.     CASE pff&
  11197.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,formfeed$,dummy%)
  11198.     CASE pschacht&
  11199.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,schacht$,dummy%)
  11200.     CASE pfettein&
  11201.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,fettein$,dummy%)
  11202.     CASE pfettaus&
  11203.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,fettaus$,dummy%)
  11204.     CASE puntein&
  11205.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,underlineein$,dummy%)
  11206.     CASE puntaus&
  11207.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,underlineaus$,dummy%)
  11208.     CASE pkopien&
  11209.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,kopienzahl$,dummy%)
  11210.     CASE pnachsp&
  11211.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,nachspann$,dummy%)
  11212.     CASE plrand&
  11213.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,linkerrand$,dummy%)
  11214.     CASE pseitenlaenge&
  11215.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,seitenlaenge$,dummy%)
  11216.     CASE poverlay&
  11217.       GOSUB befehl_auslesen(druckanpbaum_adr%,pbefehl&,overlayaufruf$,dummy%)
  11218.     ENDSELECT
  11219.     '
  11220.     ' ANGEKLICKTE STEUERZEICHEN EINSETZEN
  11221.     SELECT ex_obj%
  11222.     CASE pgrossae&
  11223.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,grossae$)
  11224.     CASE pgrossoe&
  11225.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,grossoe$)
  11226.     CASE pgrossue&
  11227.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,grossue$)
  11228.     CASE pkleinae&
  11229.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,kleinae$)
  11230.     CASE pkleinoe&
  11231.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,kleinoe$)
  11232.     CASE pkleinue&
  11233.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,kleinue$)
  11234.     CASE psz&
  11235.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,sz$)
  11236.     CASE pparagr&
  11237.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,paragraph$)
  11238.     CASE pcpi10&
  11239.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,cpi10$)
  11240.     CASE pcpi12&
  11241.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,cpi12$)
  11242.     CASE pcpi15&
  11243.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,cpi15$)
  11244.     CASE pinitial&
  11245.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,initialisierung$)
  11246.     CASE pff&
  11247.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,formfeed$)
  11248.     CASE pschacht&
  11249.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,schacht$)
  11250.     CASE pfettein&
  11251.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,fettein$)
  11252.     CASE pfettaus&
  11253.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,fettaus$)
  11254.     CASE puntein&
  11255.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,underlineein$)
  11256.     CASE puntaus&
  11257.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,underlineaus$)
  11258.     CASE pkopien&
  11259.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,kopienzahl$)
  11260.     CASE pnachsp&
  11261.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,nachspann$)
  11262.     CASE plrand&
  11263.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,linkerrand$)
  11264.     CASE pseitenlaenge&
  11265.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,seitenlaenge$)
  11266.     CASE poverlay&
  11267.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,overlayaufruf$)
  11268.     CASE pdrladen&
  11269.       GOSUB druckerladen(0)
  11270.       CHAR{{OB_SPEC(druckanpbaum_adr%,drname&)}}=druckername$
  11271.       GOSUB objc_update(druckanpbaum_adr%,drname&)
  11272.       GOSUB befehl_einsetzen(druckanpbaum_adr%,pbefehl&,grossae$)
  11273.       @select(druckanpbaum_adr%,vorherige_wahl%,FALSE)
  11274.       GOSUB objc_update(druckanpbaum_adr%,vorherige_wahl%) ! Befehl neu einsetzen
  11275.       @select(druckanpbaum_adr%,pgrossae&,TRUE)
  11276.       GOSUB objc_update(druckanpbaum_adr%,pgrossae&) ! Befehl neu einsetzen
  11277.       vorherige_wahl%=pgrossae&
  11278.       @select(druckanpbaum_adr%,pdrladen&,FALSE)
  11279.       GOSUB objc_update(druckanpbaum_adr%,pdrladen&) ! Befehl neu einsetzen
  11280.     CASE pdrspei&
  11281.       druckername$=CHAR{{OB_SPEC(druckanpbaum_adr%,drname&)}}
  11282.       GOSUB druckerspeichern
  11283.       @select(druckanpbaum_adr%,pdrspei&,FALSE)
  11284.       GOSUB objc_update(druckanpbaum_adr%,pdrspei&)
  11285.     ENDSELECT
  11286.     vorherige_wahl%=ex_obj%  ! im nächsten durchlauf benötigt
  11287.     GOSUB objc_update(druckanpbaum_adr%,pbefehl&) ! Befehl neu zeichnen
  11288.     EXIT IF ex_obj%=pok&
  11289.   LOOP
  11290.   druckername$=CHAR{{OB_SPEC(druckanpbaum_adr%,drname&)}}
  11291.   '
  11292.   ' Beenden des Dialogs
  11293.   @rsc_back(druckanpbaum&)
  11294.   @select(druckanpbaum_adr%,ex_obj%,FALSE)
  11295.   @resource_einrichten(1)
  11296. RETURN
  11297. ' *********************************************************************
  11298. > PROCEDURE befehl_auslesen(tree%,obj%,VAR steuerzeichen$,error%)
  11299.   error%=FALSE  ! Voreinstellung
  11300.   pbefehl$=CHAR{{OB_SPEC(tree%,obj%)}}
  11301.   steuerzeichen$=""
  11302.   DO
  11303.     komma%=INSTR(pbefehl$,",")
  11304.     haekchen1%=INSTR(pbefehl$,"'")
  11305.     EXIT IF LEN(pbefehl$)=0
  11306.     IF haekchen1%=1  ! d.h. es kommt 'Buchstabe'
  11307.       haekchen2%=INSTR(pbefehl$,"'",2)  ! Nach 2. Anführungszeichen suchen
  11308.       IF haekchen2%<haekchen1%  ! nur eins vorhanden
  11309.         dummy%=@rsc_alert(1,"Es fehlt ein Anführungszeichen.|Bitte Steuerzeichen prüfen !"," [OK ",1)
  11310.         error%=TRUE
  11311.         GOTO befehl_auslesen_ende
  11312.       ENDIF
  11313.       steuerzeichen$=steuerzeichen$+MID$(pbefehl$,2,haekchen2%-2)
  11314.       IF komma%>0  ! Es geht weiter
  11315.         pbefehl$=MID$(pbefehl$,komma%+1)  ! A$ aktualisieren auf den rest
  11316.       ELSE
  11317.         pbefehl$=""
  11318.       ENDIF
  11319.     ELSE IF komma%>0 ! Es kommt Zahl
  11320.       steuerzeichen$=steuerzeichen$+CHR$(VAL(LEFT$(pbefehl$,komma%-1)))
  11321.       pbefehl$=MID$(pbefehl$,komma%+1)  ! A$ aktualisieren auf den rest
  11322.     ELSE  ! letzte Zahl
  11323.       steuerzeichen$=steuerzeichen$+CHR$(VAL(pbefehl$))
  11324.       pbefehl$=""
  11325.     ENDIF
  11326.     EXIT IF komma%=0 ! auslesen des letzten Teiles erfolgt, da Abfrage am Ende
  11327.   LOOP
  11328. befehl_auslesen_ende:
  11329. RETURN
  11330. ' *********************************************************************+
  11331. > PROCEDURE befehl_einsetzen(tree%,obj%,welchen$)  ! bereitet für Dialogbox auf und setzt ein
  11332.   rueck$="" !Rücksetzen
  11333.   l%=LEN(welchen$)
  11334.   IF l%=0
  11335.     rueck$=""
  11336.   ELSE IF l%=1
  11337.     rueck$=STR$(ASC(welchen$))
  11338.   ELSE
  11339.     rueck$=rueck$+STR$(ASC(LEFT$(welchen$,1)))  ! ERSTES ZIECHEN OHNE KOMMA
  11340.     FOR i%=2 TO l%
  11341.       rueck$=rueck$+","+STR$(ASC(MID$(welchen$,i%,1)))
  11342.     NEXT i%
  11343.   ENDIF
  11344.   CHAR{{OB_SPEC(tree%,obj%)}}=rueck$
  11345. RETURN
  11346. ' ************************************************************************+
  11347. > PROCEDURE steuerzeichen_umwandeln(steuerzeichen_in_zahlen$,VAR stz$)
  11348.   stz$=""
  11349.   DO
  11350.     komma%=INSTR(steuerzeichen_in_zahlen$,",")
  11351.     laenge%=LEN(steuerzeichen_in_zahlen$)
  11352.     IF komma%<>0
  11353.       stz$=stz$+CHR$(VAL(LEFT$(steuerzeichen_in_zahlen$,komma%-1)))
  11354.       steuerzeichen_in_zahlen$=MID$(steuerzeichen_in_zahlen$,komma%+1)  ! A$ aktualisieren auf den rest
  11355.     ELSE IF LEN(steuerzeichen_in_zahlen$)<>0
  11356.       stz$=stz$+CHR$(VAL(steuerzeichen_in_zahlen$))
  11357.       steuerzeichen_in_zahlen$=""
  11358.     ENDIF
  11359.     EXIT IF LEN(steuerzeichen_in_zahlen$)=0
  11360.   LOOP
  11361. RETURN
  11362. ' ************************************************************************+
  11363. > PROCEDURE druckerladen(standard%)
  11364.   ' STANDARD% MUSS 1 SEIN, WENN DIE STANDARDANPASSUNG GELADEN WERDEN SOLL
  11365.   ' ALSO BEIM PROGRAMMSTART, 2 Wenn der MB-Drucker geladen werden soll
  11366.   ' oder 3 wenn der CMB-Drucker geladen werden soll
  11367.   ' oder 4 wenn der Konvertierungstreiber geladen werden soll
  11368.   IF standard%=0  ! Beliebigen Drucker laden mit Fileselectbvox
  11369.     pfad$=boot_pfad$+"\PRT\*.PRT"
  11370.     druckerdateiname$=@fileselect$("Drucker laden",pfad$,"STANDARD.PRT")
  11371.   ELSE IF standard%=1 !also Standarddrucker soll geladen werden
  11372.     druckerdateiname$=boot_pfad$+"\PRT\STANDARD.PRT"
  11373.   ELSE IF standard%=2 !also MB-Drucker soll geladen werden
  11374.     druckerdateiname$=boot_pfad$+"\PRT\MB.PRT"
  11375.   ELSE IF standard%=3 !also CMB-Drucker soll geladen werden
  11376.     druckerdateiname$=boot_pfad$+"\PRT\CMB.PRT"
  11377.   ELSE IF standard%=4 !also Konvertierungsdruckertreiber
  11378.     druckerdateiname$=boot_pfad$+"\PRT\KONVERT.PRT"
  11379.   ENDIF
  11380.   IF druckerdateiname$="" OR RIGHT$(druckerdateiname$)="\"
  11381.     GOTO druckerladenende
  11382.   ENDIF
  11383.   IF EXIST(druckerdateiname$)
  11384.     ' ÜBERPRÜFEN, OB DIE DRUCKERDATEI VERSION 1.XX ODER VERSION 2.XX IST
  11385.     ' ANNAHME: IN JEDER DRUCKERDATEI IST EIN "ESC"-CODE, ALSO ZAHL "27" VORHANDEN
  11386.     OPEN "I",#1,druckerdateiname$
  11387.     l%=LOF(#1)
  11388.     druckeranpassung$=INPUT$(l%,#1)  ! gesamte Druckerdatei eingelesen
  11389.     CLOSE #1
  11390.     '
  11391.     IF INSTR(druckeranpassung$,CHR$(27))>0  ! dann Version 1.XX
  11392.       OPEN "I",#1,druckerdateiname$
  11393.       INPUT #1,initialisierung$,nachspann$,kopienzahl$,formfeed$,schacht$,cpi10$,cpi12$,cpi15$,fettein$,fettaus$,underlineein$,underlineaus$,grossae$,kleinae$,grossoe$,kleinoe$,grossue$,kleinue$,sz$,paragraph$
  11394.       IF EOF(#1)=TRUE
  11395.         CLOSE #1  ! für alte Version ohne Druckernamen
  11396.         druckername$=""
  11397.       ELSE
  11398.         INPUT #1,druckername$
  11399.         CLOSE #1
  11400.       ENDIF
  11401.     ELSE  ! Druckerdateiversion 2.XX, da Klartext kann kein ESC (chr$(27)) dabei sein
  11402.       OPEN "I",#1,druckerdateiname$
  11403.       INPUT #1,druckerdateiversion#
  11404.       INPUT #1,druckername$
  11405.       INPUT #1,initialisierung$,nachspann$,kopienzahl$,formfeed$,schacht$,cpi10$,cpi12$,cpi15$,fettein$,fettaus$,underlineein$,underlineaus$,grossae$,kleinae$,grossoe$,kleinoe$,grossue$,kleinue$,sz$,paragraph$,linkerrand$,seitenlaenge$
  11406.       INPUT #1,overlayaufruf$,overlayeinleitung$,overlaynachspann$
  11407.       CLOSE #1
  11408.       ' UMWANDLUNG VON KLARTEXT IN STEUERCODES
  11409.       GOSUB steuerzeichen_umwandeln(initialisierung$,initialisierung$)
  11410.       GOSUB steuerzeichen_umwandeln(nachspann$,nachspann$)
  11411.       GOSUB steuerzeichen_umwandeln(kopienzahl$,kopienzahl$)
  11412.       GOSUB steuerzeichen_umwandeln(formfeed$,formfeed$)
  11413.       GOSUB steuerzeichen_umwandeln(schacht$,schacht$)
  11414.       GOSUB steuerzeichen_umwandeln(cpi10$,cpi10$)
  11415.       GOSUB steuerzeichen_umwandeln(cpi12$,cpi12$)
  11416.       GOSUB steuerzeichen_umwandeln(cpi15$,cpi15$)
  11417.       GOSUB steuerzeichen_umwandeln(fettein$,fettein$)
  11418.       GOSUB steuerzeichen_umwandeln(fettaus$,fettaus$)
  11419.       GOSUB steuerzeichen_umwandeln(underlineein$,underlineein$)
  11420.       GOSUB steuerzeichen_umwandeln(underlineaus$,underlineaus$)
  11421.       GOSUB steuerzeichen_umwandeln(grossae$,grossae$)
  11422.       GOSUB steuerzeichen_umwandeln(kleinae$,kleinae$)
  11423.       GOSUB steuerzeichen_umwandeln(grossoe$,grossoe$)
  11424.       GOSUB steuerzeichen_umwandeln(kleinoe$,kleinoe$)
  11425.       GOSUB steuerzeichen_umwandeln(grossue$,grossue$)
  11426.       GOSUB steuerzeichen_umwandeln(kleinue$,kleinue$)
  11427.       GOSUB steuerzeichen_umwandeln(sz$,sz$)
  11428.       GOSUB steuerzeichen_umwandeln(paragraph$,paragraph$)
  11429.       GOSUB steuerzeichen_umwandeln(linkerrand$,linkerrand$)
  11430.       GOSUB steuerzeichen_umwandeln(seitenlaenge$,seitenlaenge$)
  11431.       GOSUB steuerzeichen_umwandeln(overlayaufruf$,overlayaufruf$)
  11432.       GOSUB steuerzeichen_umwandeln(overlayeinleitung$,overlayeinleitung$)
  11433.       GOSUB steuerzeichen_umwandeln(overlaynachspann$,overlaynachspann$)
  11434.     ENDIF
  11435.   ELSE
  11436.     ~@rsc_alert(1,"Druckertreiberdatei|"+druckerdateiname$+"|nicht gefunden. Bitte im Menü|'Druckeranpassung' laden."," [OK ",1)
  11437.   ENDIF
  11438. druckerladenende:
  11439. RETURN
  11440. ' ************************************************************************
  11441. > PROCEDURE druckerspeichern  ! Klartextspeichern ab V 2.00
  11442.   pfad$=boot_pfad$+"\PRT\*.PRT"
  11443.   backslash_pos%=RINSTR(druckerdateiname$,"\")
  11444.   voreinstellungsdruckerdateiname$=MID$(druckerdateiname$,backslash_pos%+1)
  11445.   druckerdateiname$=@fileselect$("Drucker speichern",pfad$,voreinstellungsdruckerdateiname$)
  11446.   IF druckerdateiname$="" OR RIGHT$(druckerdateiname$)="\"
  11447.     GOTO druckerspeichernende
  11448.   ENDIF
  11449.   OPEN "O",#1,druckerdateiname$
  11450.   WRITE #1,version#  ! FÜR SPÄTERE ERKENNUNG
  11451.   WRITE #1,druckername$
  11452.   GOSUB steuerzeichen_speichern(initialisierung$)
  11453.   GOSUB steuerzeichen_speichern(nachspann$)
  11454.   GOSUB steuerzeichen_speichern(kopienzahl$)
  11455.   GOSUB steuerzeichen_speichern(formfeed$)
  11456.   GOSUB steuerzeichen_speichern(schacht$)
  11457.   GOSUB steuerzeichen_speichern(cpi10$)
  11458.   GOSUB steuerzeichen_speichern(cpi12$)
  11459.   GOSUB steuerzeichen_speichern(cpi15$)
  11460.   GOSUB steuerzeichen_speichern(fettein$)
  11461.   GOSUB steuerzeichen_speichern(fettaus$)
  11462.   GOSUB steuerzeichen_speichern(underlineein$)
  11463.   GOSUB steuerzeichen_speichern(underlineaus$)
  11464.   GOSUB steuerzeichen_speichern(grossae$)
  11465.   GOSUB steuerzeichen_speichern(kleinae$)
  11466.   GOSUB steuerzeichen_speichern(grossoe$)
  11467.   GOSUB steuerzeichen_speichern(kleinoe$)
  11468.   GOSUB steuerzeichen_speichern(grossue$)
  11469.   GOSUB steuerzeichen_speichern(kleinue$)
  11470.   GOSUB steuerzeichen_speichern(sz$)
  11471.   GOSUB steuerzeichen_speichern(paragraph$)
  11472.   GOSUB steuerzeichen_speichern(linkerrand$)
  11473.   GOSUB steuerzeichen_speichern(seitenlaenge$)
  11474.   GOSUB steuerzeichen_speichern(overlayaufruf$)
  11475.   GOSUB steuerzeichen_speichern(overlayeinleitung$)
  11476.   GOSUB steuerzeichen_speichern(overlaynachspann$)
  11477.   CLOSE #1
  11478. druckerspeichernende:
  11479. RETURN
  11480. ' ***********************************************************
  11481. > PROCEDURE steuerzeichen_speichern(stz$) ! SPEICHERT IM KLARTEXT AB V 2.00
  11482.   klartextsteuerzeichen$="" !Rücksetzen
  11483.   l%=LEN(stz$)
  11484.   SELECT l%
  11485.   CASE 0
  11486.     klartextsteuerzeichen$=""
  11487.   CASE 1
  11488.     klartextsteuerzeichen$=STR$(ASC(stz$))
  11489.   DEFAULT
  11490.     klartextsteuerzeichen$=klartextsteuerzeichen$+STR$(ASC(LEFT$(stz$,1)))  ! ERSTES ZIECHEN OHNE KOMMA
  11491.     FOR i%=2 TO l%
  11492.       klartextsteuerzeichen$=klartextsteuerzeichen$+","+STR$(ASC(MID$(stz$,i%,1)))
  11493.     NEXT i%
  11494.   ENDSELECT
  11495.   WRITE #1,klartextsteuerzeichen$
  11496. RETURN
  11497. ' ************************************************************
  11498. '
  11499. ' Ausgabeportfestlegung
  11500. '
  11501. ' *********************************************************+
  11502. > PROCEDURE druckport_festlegen
  11503.   @resource_einrichten(2)
  11504.   druckportbaum_adr%=rsc_adr%(druckportbaum&)
  11505.   @dialog_positionieren(druckportbaum&)
  11506.   ' Vorbereitung des Dialogs
  11507.   IF druckport%=2  ! serieller Port
  11508.     @select(druckportbaum_adr%,dpparallel&,FALSE)
  11509.     @select(druckportbaum_adr%,dpseriell&,TRUE)
  11510.   ELSE
  11511.     @select(druckportbaum_adr%,dpparallel&,TRUE)
  11512.     @select(druckportbaum_adr%,dpseriell&,FALSE)
  11513.   ENDIF
  11514.   rsc_draw(druckportbaum&,fensterdial%)
  11515.   ' Duchführen des Dialogs
  11516.   ex_obj%=@rsc_do(druckportbaum&,0,dummy&)  ! dummy, da kein Popupmenu in der Box
  11517.   IF ex_obj%=dpok&  ! Daten auslesen
  11518.     optionsaenderung%=TRUE
  11519.     IF @selected(druckportbaum_adr%,dpseriell&)=TRUE
  11520.       druckport%=2  ! seriell
  11521.     ELSE
  11522.       druckport%=1  ! Regelfall parallel
  11523.     ENDIF
  11524.   ENDIF
  11525.   '
  11526.   ' Beenden des Dialogs
  11527.   rsc_back(druckportbaum&)
  11528.   @select(druckportbaum_adr%,ex_obj%,FALSE)
  11529.   @resource_einrichten(1)
  11530. RETURN
  11531. ' *****************************************************
  11532. '
  11533. ' AUSGABEUMWANDLUNG UND AUSDRUCK
  11534. '
  11535. ' ********************************************************
  11536. > PROCEDURE ausgabeumwandlung(originaltxt$,VAR rueck$)
  11537.   rueck$=originaltxt$
  11538.   ' UMWANDLUNG VON Ä
  11539.   IF grossae$<>"Ä"  ! Nur wenn Ä<>Ä ist Umwandlung nötig
  11540.     pos%=1
  11541.     DO
  11542.       a%=INSTR(rueck$,"Ä",pos%)
  11543.       EXIT IF a%=0
  11544.       rueck$=LEFT$(rueck$,a%-1)+grossae$+MID$(rueck$,a%+1)
  11545.       ADD pos%,LEN(grossae$)
  11546.     LOOP
  11547.   ENDIF
  11548.   ' UMWANDLUNG VON ä
  11549.   IF kleinae$<>"ä"  ! Nur wenn ä<>ä ist Umwandlung nötig
  11550.     pos%=1
  11551.     DO
  11552.       a%=INSTR(rueck$,"ä",pos%)
  11553.       EXIT IF a%=0
  11554.       rueck$=LEFT$(rueck$,a%-1)+kleinae$+MID$(rueck$,a%+1)
  11555.       ADD pos%,LEN(kleinae$)
  11556.     LOOP
  11557.   ENDIF
  11558.   ' UMWANDLUNG VON Ö
  11559.   IF grossoe$<>"Ö"  ! Nur wenn Ö<>Ö ist Umwandlung nötig
  11560.     pos%=1
  11561.     DO
  11562.       a%=INSTR(rueck$,"Ö",pos%)
  11563.       EXIT IF a%=0
  11564.       rueck$=LEFT$(rueck$,a%-1)+grossoe$+MID$(rueck$,a%+1)
  11565.       ADD pos%,LEN(grossoe$)
  11566.     LOOP
  11567.   ENDIF
  11568.   ' UMWANDLUNG VON ö
  11569.   IF kleinoe$<>"ö"  ! Nur wenn ö<>ö ist Umwandlung nötig
  11570.     pos%=1
  11571.     DO
  11572.       a%=INSTR(rueck$,"ö",pos%)
  11573.       EXIT IF a%=0
  11574.       rueck$=LEFT$(rueck$,a%-1)+kleinoe$+MID$(rueck$,a%+1)
  11575.       ADD pos%,LEN(kleinoe$)
  11576.     LOOP
  11577.   ENDIF
  11578.   ' UMWANDLUNG VON Ü
  11579.   IF grossue$<>"Ü"  ! Nur wenn Ü<>Ü ist Umwandlung nötig
  11580.     pos%=1
  11581.     DO
  11582.       a%=INSTR(rueck$,"Ü",pos%)
  11583.       EXIT IF a%=0
  11584.       rueck$=LEFT$(rueck$,a%-1)+grossue$+MID$(rueck$,a%+1)
  11585.       ADD pos%,LEN(grossue$)
  11586.     LOOP
  11587.   ENDIF
  11588.   ' UMWANDLUNG VON ü
  11589.   IF kleinue$<>"ü"  ! Nur wenn ü<>ü ist Umwandlung nötig
  11590.     pos%=1
  11591.     DO
  11592.       a%=INSTR(rueck$,"ü",pos%)
  11593.       EXIT IF a%=0
  11594.       rueck$=LEFT$(rueck$,a%-1)+kleinue$+MID$(rueck$,a%+1)
  11595.       ADD pos%,LEN(kleinue$)
  11596.     LOOP
  11597.   ENDIF
  11598.   ' UMWANDLUNG VON ß
  11599.   IF sz$<>"ß"  ! Nur wenn ß<>ß ist Umwandlung nötig
  11600.     pos%=1
  11601.     DO
  11602.       a%=INSTR(rueck$,"ß",pos%)
  11603.       EXIT IF a%=0
  11604.       rueck$=LEFT$(rueck$,a%-1)+sz$+MID$(rueck$,a%+1)
  11605.       ADD pos%,LEN(sz$)
  11606.     LOOP
  11607.   ENDIF
  11608.   ' UMWANDLUNG VON §
  11609.   IF paragraph$<>"§"  ! Nur wenn §<>§ ist Umwandlung nötig
  11610.     pos%=1
  11611.     DO
  11612.       a%=INSTR(rueck$,"§",pos%)
  11613.       EXIT IF a%=0
  11614.       rueck$=LEFT$(rueck$,a%-1)+paragraph$+MID$(rueck$,a%+1)
  11615.       ADD pos%,LEN(paragraph$)
  11616.     LOOP
  11617.   ENDIF
  11618. RETURN
  11619. ' ***********************************************************************
  11620. > PROCEDURE zeilendruck(txt$)
  11621.   ' ABSTAND_VON_LINKS% UND ZEICHEN_PRO_ZEILE% SIND BEKANNT UND GLOBAL
  11622.   ' Präferenz von Returns muß gewährleistet sein
  11623.   ' VOREINSTELLUNG
  11624.   umbrechen%=TRUE
  11625.   tatsaechliche_zeichenzahl%=zeichen_pro_zeile%  ! Voreinstellung
  11626.   DO
  11627.     ' +++ DRUCKER AUF EMPFANGSBEREITSCHAFT TESTEN +++
  11628.   empfangstest:
  11629.     IF OUT?(0)=FALSE  !GEMDOS(17)
  11630.       PAUSE 300  ! Zuerst etwas abwarten
  11631.       IF OUT?(0)=FALSE   !GEMDOS(17) Dann nochmal probieren
  11632.         DEFMOUSE 0
  11633.         dummy%=@rsc_alert(1,"Ihr Drucker nimmt gerade|keine Daten ab.|Puffer/Spooler voll ?","[OK|[Abbruch",1)
  11634.         IF dummy%=1
  11635.           GOTO empfangstest
  11636.         ELSE
  11637.           druckabbruch%=1
  11638.           GOTO zeilendruckende
  11639.         ENDIF
  11640.       ENDIF
  11641.     ENDIF
  11642.     '
  11643.     ' +++ Vorwerte ermitteln +++
  11644.     ' Tatsächliche Zeichenzahl paßt maximal in 1 Zeile
  11645.     zeilenlaenge%=MIN(INSTR(txt$,CHR$(13)),tatsaechliche_zeichenzahl%)
  11646.     stz%=RINSTR(txt$,CHR$(253),zeilenlaenge%) ! Steuerzeichen
  11647.     IF stz%>0  ! innerhalb der Zeile
  11648.       SELECT ASC(MID$(txt$,stz%+1,1))  ! nächstes Zeichen nach chr$(253)
  11649.       CASE 0  ! 10 cpi
  11650.         tatsaechliche_zeichenzahl%=zeichen_pro_zeile%
  11651.       CASE 1  ! 12 cpi
  11652.         tatsaechliche_zeichenzahl%=INT(zeichen_pro_zeile%*12/10)
  11653.       CASE 2  ! 15 cpi
  11654.         tatsaechliche_zeichenzahl%=INT(zeichen_pro_zeile%*15/10)
  11655.       CASE 5  ! nicht umbrechen
  11656.         umbrechen%=FALSE  ! nicht umbrechen
  11657.       CASE 6
  11658.         umbrechen%=TRUE  ! wieder umbrechen
  11659.       ENDSELECT
  11660.       txt$=LEFT$(txt$,stz%-1)+MID$(txt$,stz%+2)  ! Steuerzeichen wieder rausgeschmissen
  11661.     ENDIF
  11662.     laenge%=LEN(txt$)
  11663.     EXIT IF laenge%=0  ! FALLS KEIN TEXT DEFINIERT IST
  11664.     restzeichenzahl%=MIN(laenge%,tatsaechliche_zeichenzahl%)
  11665.     cr1_pos%=RINSTR(restzeichenzahl%,txt$,CHR$(13)) ! von rechts
  11666.     cr2_pos%=INSTR(txt$,CHR$(13)) ! von links
  11667.     leerzeichen_pos%=RINSTR(txt$," ",restzeichenzahl%)
  11668.     '
  11669.     '
  11670.     ' +++ Fallgruppen +++
  11671.     ' Formfeedbefehl (muß allein in einer Zeile stehen)
  11672.     ' dann Vorschub erzeugen, aktuelle Zeile aktualisieren, dann @formfeed
  11673.     IF LEFT$(txt$,LEN(formfeed$))=formfeed$
  11674.       FOR a%=1 TO seitenlaenge%-abstand_von_unten%-aktuelle_druckzeile%
  11675.         PRINT #0
  11676.         INC aktuelle_druckzeile%
  11677.       NEXT a%
  11678.       @formfeed  ! erzeugt vorschub und Abstand von oben +Seitenzahl usw.
  11679.       ' txt$ aktualiseren
  11680.       IF ASC(MID$(txt$,cr2_pos%+1))=10  ! 10 =Linefeed
  11681.         txt$=MID$(txt$,cr2_pos%+2)  ! CR und Linefeed Aussortieren
  11682.       ELSE
  11683.         txt$=MID$(txt$,cr2_pos%+1)  ! CR Aussortieren
  11684.       ENDIF
  11685.       ' --- 2. Präferenz: CR innerhalb der Zeile ---
  11686.     ELSE IF cr1_pos%>0 OR umbrechen%=FALSE ! CR innerhalb der Zeile vorhanden oder UMBRUCH VERBOTEN
  11687.       ' Dann von links gesehen das erste CR nehmen und Zeile ausgeben
  11688.       z$=LEFT$(txt$,cr2_pos%-1)
  11689.       GOSUB ausgabeumwandlung(z$,zeile$)
  11690.       PRINT #0;zeile$
  11691.       INC aktuelle_druckzeile%
  11692.       GOSUB formfeed
  11693.       IF ASC(MID$(txt$,cr2_pos%+1))=10  ! 10 =Linefeed
  11694.         txt$=MID$(txt$,cr2_pos%+2)  ! CR und Linefeed Aussortieren
  11695.       ELSE
  11696.         txt$=MID$(txt$,cr2_pos%+1)  ! CR Aussortieren
  11697.       ENDIF
  11698.     ELSE
  11699.       ' --- 3. Präferenz kein CR  ==> Leerzeichentrennung ---
  11700.       ' ES MUSS EIN LEERZEICHEN VORHANDEN SEIN INNERHALB DER ZEILE !!!
  11701.       lp%=MAX(0,leerzeichen_pos%-1)
  11702.       z$=LEFT$(txt$,lp%)  ! AUSZUGEBENDE ZEILE
  11703.       GOSUB ausgabeumwandlung(z$,zeile$)
  11704.       PRINT #0;zeile$
  11705.       INC aktuelle_druckzeile%
  11706.       GOSUB formfeed
  11707.       ' AKTUALISIEREN VON TXT$
  11708.       txt$=MID$(txt$,leerzeichen_pos%+1)  ! NUR DEN REST ALS TXT$ BEHALTEN
  11709.     ENDIF
  11710.     EXIT IF txt$=""
  11711.   LOOP
  11712. zeilendruckende:
  11713. RETURN
  11714. ' **********************************************************************
  11715. > PROCEDURE formfeed
  11716.   IF (seitenlaenge%-abstand_von_unten%-aktuelle_druckzeile%)<=0
  11717.     FOR i%=1 TO abstand_fusszeile%
  11718.       PRINT #0
  11719.     NEXT i%
  11720.     PRINT #0;fettaus$;underlineaus$;  ! Ohne GOSUB, damit hinterher wieder eingeschaltet werden kann
  11721.     '    seitennrjustierung%:  ! 0=links, 1=Mitte, 2=rechts
  11722.     dummy%=INT((zeichen_pro_zeile%-5)*seitennrjustierung%/2) ! 5= länge der Seitenzahl
  11723.     PRINT #0;SPACE$(dummy%);"- ";seitennummer%;" -"
  11724.     PRINT #0;formfeed$;  !FORMFEED
  11725.     IF seitennummer%=1 AND schacht$<>""
  11726.       PRINT #0;schacht$;  ! Falls definiert, SCHACHTWAHL
  11727.     ENDIF
  11728.     INC seitennummer%
  11729.     aktuelle_druckzeile%=1  ! Rücksetzen der tats. seitenzeile
  11730.     FOR a%=1 TO abstand_von_oben%
  11731.       PRINT #0  ! Oberer Abstand
  11732.       INC aktuelle_druckzeile%
  11733.     NEXT a%
  11734.   ENDIF
  11735. RETURN
  11736. ' ******************************************************************+
  11737. > PROCEDURE open_drucker
  11738.   IF druckport%=1  ! Parallele Schnittstelle
  11739.     OPEN "",#0,"LST:"  ! Öffnet Drucker als Ausgabekanal, wegen GFA-Fehler die
  11740.     ' einzige Möglichkeit, auf dem Falcon Ausdrucke zu ermöglichen
  11741.   ELSE IF druckport%=2  ! serielle Schnittstelle
  11742.     OPEN "",#0,"AUX:"
  11743.   ENDIF
  11744. RETURN
  11745. ' ******************************************************************
  11746. > PROCEDURE close_drucker
  11747.   CLOSE #0
  11748. RETURN
  11749. ' **********************************************************************
  11750. '
  11751. ' AUSGABE DER STEUERZEICHEN
  11752. '
  11753. ' ********************************************************
  11754. > PROCEDURE initialisierung
  11755.   PRINT #0;initialisierung$;   ! Initialisierung
  11756. RETURN
  11757. ' ******************************************************************
  11758. > PROCEDURE cpi(dichte%) ! Aufruf muß cpi-Zahl übergeben
  11759.   SELECT dichte%
  11760.   CASE 10
  11761.     PRINT #0;cpi10$;
  11762.     cpi#=10
  11763.   CASE 12
  11764.     PRINT #0;cpi12$;
  11765.     cpi#=12
  11766.   CASE 15
  11767.     PRINT #0;cpi15$;
  11768.     cpi#=15
  11769.   DEFAULT  ! Bei falscher Übergabe
  11770.     PRINT #0;cpi10$;
  11771.     cpi#=10
  11772.   ENDSELECT
  11773. RETURN
  11774. ' **********************************************************************
  11775. > PROCEDURE fett(schalt%)  ! 1 für einschalten, 0 für Ausschalten
  11776.   ' fett% hat Wert 1 wenn Fettdruck eingeschaltete ist, sonst 0
  11777.   IF schalt%=1
  11778.     fett%=1
  11779.     PRINT #0;fettein$; ! mit SEMIKOLON, damit kein Zeilenvorschub
  11780.   ELSE
  11781.     fett%=0
  11782.     PRINT #0;fettaus$;
  11783.   ENDIF
  11784. RETURN
  11785. ' ********************************************************************
  11786. > PROCEDURE underline(schalt%)  ! underline%=1 für ein, 0 für ausschalten
  11787.   IF schalt%=1
  11788.     underline%=1
  11789.     PRINT #0;underlineein$; !steuerzeichen mit SEMIKOLON, damit kein Zeilenvorschub
  11790.   ELSE
  11791.     underline%=0
  11792.     PRINT #0;underlineaus$;
  11793.   ENDIF
  11794. RETURN
  11795. ' **********************************************************************
  11796. '
  11797. '
  11798. ' ==================================================================
  11799. ' FEHLERBEHANDLUNG UND BEENDEN
  11800. ' ===================================================================
  11801. ' *************************************************************************
  11802. > PROCEDURE fehler
  11803.   ~FORM_ALERT(1,ERR$(ERR))
  11804.   ON ERROR GOSUB fehler
  11805.   dummy%=@rsc_alert(1,"Programm beenden und|Daten sichern oder|Fortsetzung versuchen ?","[Weiter|[Abbruch",1)
  11806.   IF dummy%=1
  11807.     IF FATAL=TRUE
  11808.       ~@rsc_alert(1,"Fataler Fehler !|Fortsetzung leider|nicht möglich !"," [OK ",1)
  11809.       GOSUB global_exit
  11810.     ENDIF
  11811.     ON ERROR GOSUB fehler
  11812.     RESUME NEXT
  11813.   ELSE
  11814.     GOSUB global_exit
  11815.   ENDIF
  11816. RETURN
  11817. ' *****************************************************************
  11818. > PROCEDURE halt(haltepunkt%)
  11819.   dummy%=@rsc_alert(1,"Geld_her!|Breakpunkt Nr. "+STR$(haltepunkt%)," [Weiter|STOP",1)
  11820.   IF dummy%=2
  11821.     STOP
  11822.   ENDIF
  11823. RETURN
  11824. ' ***************************************************************************
  11825. '
  11826. '
  11827. ' ==================================================================
  11828. ' WINLIB
  11829. ' ============================================================
  11830. ' Mydial-Einbindung, XRSRC-Einbindung und Winlib
  11831. ' (c) 1993 by Stefan Münch
  11832. '
  11833. ' AB HIER REINE LIBRARYFUNKTIONEN
  11834. ' ================================
  11835. '
  11836. ' * programmabhängige Fenster-Funktionen
  11837. ' **************************************************************
  11838. > PROCEDURE oeffne_fenster(nr&,mod|)
  11839.   ' zur Erinnerung / Attributbits:
  11840.   ' 0: NAME, 1: CLOSE, 2: FULL, 3: MOVE, 4: INFO, 5: SIZE
  11841.   ' 6: UPARROW, 7: DNARROW, 8: VSLIDE, 9: LFARROW, A: RTARROW, B: HSLIDE
  11842.   SELECT nr&
  11843.   CASE 0
  11844.     '  Text
  11845.     ~WIND_GET(0,4,dummy%,dummy%,w%,h%)  ! Desktopmaße
  11846.     cols&=INT(w%/charw&)-4
  11847.     lines&=INT(h%/charh&)-3
  11848.     @define_wind(0,&X111111111111,0,0,charw&*SUCC(cols&),charh&*lines&,charw&,charh&,0,0,"",1)
  11849.     @set_wind_line(0,2,titles%)
  11850.     @set_wind_line(0,3,titles%+80)
  11851.     @open_wind(0,mod|,xwin%(0),ywin%(0),wwin%(0),hwin%(0),hoff%(0),voff%(0))
  11852.   ENDSELECT
  11853. RETURN
  11854. ' *************************************************************
  11855. > PROCEDURE my_cursor(msg$,no%)
  11856.   ' Cursorsteuerung a la QED (nicht ganz, aber teilweise besser ;-),
  11857.   ' nur für das Text-Fenster (2)
  11858.   LOCAL x%,y%,newp!,nr&
  11859.   newp!=FALSE
  11860.   nr&=@win_top
  11861.   IF nr&=2
  11862.     @win_get_cur_xy(2,x%,y%)
  11863.     IF msg$=">"
  11864.       IF x%+1>LEN(text$(y%))
  11865.         IF y%<PRED(lines&)
  11866.           newp!=@cursor_set(2,0,y%+1)
  11867.         ENDIF
  11868.       ELSE
  11869.         newp!=@cursor_wind(2,msg$,no%)
  11870.       ENDIF
  11871.     ELSE IF msg$="<"
  11872.       IF x%-1<0
  11873.         IF y%>0
  11874.           newp!=@cursor_set(2,LEN(text$(y%-1))-1,y%-1)
  11875.         ENDIF
  11876.       ELSE
  11877.         newp!=@cursor_wind(2,msg$,no%)
  11878.       ENDIF
  11879.     ELSE IF msg$="v"
  11880.       y%=MIN(PRED(lines&),y%+no%)
  11881.       IF LEN(text$(y%))<x%
  11882.         newp!=@cursor_set(2,LEN(text$(y%)),y%)
  11883.       ELSE
  11884.         newp!=@cursor_wind(2,msg$,no%)
  11885.       ENDIF
  11886.     ELSE IF msg$="^"
  11887.       y%=MAX(0,y%-no%)
  11888.       IF LEN(text$(y%))<x%
  11889.         newp!=@cursor_set(2,LEN(text$(y%)),y%)
  11890.       ELSE
  11891.         newp!=@cursor_wind(2,msg$,no%)
  11892.       ENDIF
  11893.     ELSE IF LEFT$(msg$,2)="WD"
  11894.       DIM find$(3)
  11895.       find$(0)="! "
  11896.       find$(1)="? "
  11897.       find$(2)=". "
  11898.       find$(3)=" "
  11899.       IF msg$="WD>"
  11900.         p&=@xinstr(lines&,x%,y%,text$(),find$())
  11901.         ERASE find$()
  11902.         IF p&>0
  11903.           newp!=@cursor_set(2,p&,y%)
  11904.         ENDIF
  11905.       ELSE IF msg$="WD<"
  11906.         p&=@xinstr(-1,x%,y%,text$(),find$())
  11907.         IF p&>0
  11908.           newp!=@cursor_set(2,p&,y%)
  11909.         ENDIF
  11910.       ENDIF
  11911.       ERASE find$()
  11912.     ELSE IF msg$="PG>"
  11913.       newp!=@cursor_set(2,LEN(text$(y%)),y%)
  11914.     ELSE IF msg$="PG<"
  11915.       newp!=@cursor_set(2,0,y%)
  11916.     ELSE IF msg$="BOTTOM"
  11917.       newp!=@cursor_set(2,0,lines&)
  11918.     ELSE ! alle anderen Msgs
  11919.       newp!=@cursor_wind(2,msg$,no%)
  11920.     ENDIF
  11921.   ELSE   ! andere Fenster als 2
  11922.     IF msg$="WD>"
  11923.       newp!=@cursor_wind(nr&,">",4)
  11924.     ELSE IF msg$="WD<"
  11925.       newp!=@cursor_wind(nr&,"<",4)
  11926.     ELSE
  11927.       newp!=@cursor_wind(nr&,msg$,no%)
  11928.     ENDIF
  11929.   ENDIF
  11930.   IF newp!
  11931.     '    @zeige_position(nr&)
  11932.   ENDIF
  11933. RETURN
  11934. ' ****************************************************************
  11935. > FUNCTION xinstr(max%,x%,VAR y%,q$(),f$())  ! Wofür soll die gut sein ?
  11936.   LOCAL to&,i&,p&
  11937.   IF max%=0
  11938.     RETURN x%
  11939.   ENDIF
  11940.   to&=PRED(DIM?(f$()))
  11941.   p&=0
  11942.   DO
  11943.     FOR i&=0 TO to&
  11944.       IF max%>-1
  11945.         IF p&>0
  11946.           p&=MIN(p&,INSTR(q$(y%),f$(i&),x%+1))
  11947.         ELSE
  11948.           p&=INSTR(q$(y%),f$(i&),x%+1)
  11949.         ENDIF
  11950.       ELSE
  11951.         p&=MAX(p&,RINSTR(q$(y%),f$(i&),x%+PRED(LEN(f$(i&)))))
  11952.       ENDIF
  11953.     NEXT i&
  11954.     EXIT IF p&>0
  11955.     ADD y%,SGN(max%)
  11956.     EXIT IF y%=max%
  11957.     IF max%>0
  11958.       x%=0
  11959.     ELSE
  11960.       x%=LEN(q$(y%))+1
  11961.     ENDIF
  11962.   LOOP
  11963.   RETURN p&
  11964. ENDFUNC
  11965. ' ********************************************************+
  11966. '
  11967. '
  11968. '
  11969. ' *******************************************************************+++
  11970. > PROCEDURE menu_event
  11971.   @menu_evaluation(MENU(4),MENU(5))
  11972. RETURN
  11973. ' *******************************************************************
  11974. > PROCEDURE menu_evaluation(menutitle&,menuitem&)  ! Geändert 20.11.93 SH
  11975.   '
  11976.   abbruch%=FALSE  ! Globale Variable Abbruch% rücksetzen
  11977.   SELECT menutitle&
  11978.     ' ============================
  11979.   CASE desk&  ! MENUTITEL DESK
  11980.     '
  11981.     IF menuitem&=rastinfo&
  11982.       DEFMOUSE 0
  11983.       GOSUB info
  11984.     ENDIF
  11985.     '
  11986.     '
  11987.     ' ================================
  11988.   CASE datei&  ! MENUTITEL DATEI
  11989.     SELECT menuitem&
  11990.     CASE dneuabrg&  ! Menüpunkt NEUE ABRECHNUNG
  11991.       DEFMOUSE 0
  11992.       GOSUB freiezeilefinden(1,freiezeile%)
  11993.       IF freiezeile%>1 AND aufstellungsaenderung#=TRUE
  11994.         a%=@rsc_alert(1,"Forderungsberechnung wurde|geändert, aber noch|nicht abgespeichert.","[Weiter|[Zurück",1)
  11995.         IF a%=2
  11996.           GOTO neueabrechnungende
  11997.         ENDIF
  11998.       ENDIF
  11999.       GOSUB feldleeren
  12000.       GOSUB az("")
  12001.       GOSUB falleingaben
  12002.       CHAR{titles%+80}=" NR.  DATUM     HAUPTFDG    KOSTEN    ZINSEN  K-ZINS ANMERKUNGEN"
  12003.       @set_wind_line(2,3,titles%+80)  ! Entspricht infowindow
  12004.       DEFMOUSE 0
  12005.       aufstellungsaenderung#=FALSE
  12006.       verrechnungsart#=standardverrechnungsart#
  12007.       GOSUB abr367
  12008.     neueabrechnungende:
  12009.       '
  12010.     CASE dabrerg&  ! Menüpunkt ABRECHNUNG ERGÄNZEN
  12011.       DEFMOUSE 0
  12012.       GOSUB freiezeilefinden(1,freiezeile%)
  12013.       IF freiezeile%=1
  12014.         ' Abbrechen wenn keine Fdg-berechnung im Speicher ist
  12015.         ~@rsc_alert(1,"Anwahl des Menüpunktes|'Abrechnung ergänzen' sinnlos|Wählen Sie 'Neue Abrechnung'."," [OK ",1)
  12016.         GOTO menu_abarbeiten_ende
  12017.       ENDIF
  12018.       CHAR{titles%+80}=" NR.  DATUM     HAUPTFDG    KOSTEN    ZINSEN  K-ZINS ANMERKUNGEN"
  12019.       @set_wind_line(2,3,titles%+80)  ! Entspricht infowindow
  12020.       GOSUB abr367   ! UNTERSCHIED ZU 367: HIER WIRD DAS FELD NICHT GELÖSCHT
  12021.       '
  12022.     CASE dzeiloe&  ! Menüpunkt ZEILE LÖSCHEN
  12023.       DEFMOUSE 0
  12024.       GOSUB loeschzeile
  12025.       '
  12026.     CASE dladen&  ! Menüpunkt LADEN
  12027.       DEFMOUSE 0
  12028.       GOSUB freiezeilefinden(1,freiezeile%)
  12029.       IF freiezeile%>1 AND aufstellungsaenderung#=TRUE
  12030.         a%=@rsc_alert(1,"Forderungsberechnung wurde|geändert, aber noch|nicht abgespeichert.","[Weiter|[Zurück",1)
  12031.         IF a%=2
  12032.           GOTO ladenende
  12033.         ENDIF
  12034.       ENDIF
  12035.       @feldleeren
  12036.       GOSUB diskladen("")
  12037.       CHAR{titles%+80}=" NR.  DATUM     HAUPTFDG    KOSTEN    ZINSEN  K-ZINS ANMERKUNGEN"
  12038.       @set_wind_line(0,3,titles%+80)  ! Entspricht infowindow
  12039.       IF diskladenabbruch%=FALSE  ! Also erfolgreich geladen wurde
  12040.         GOSUB az(az$)
  12041.         GOSUB zustelldatum_pruefen
  12042.         GOSUB neuberechnung(1)
  12043.         GOSUB forderungstextfeld  ! sofort anzeigen
  12044.         GOSUB falleingaben
  12045.       ELSE
  12046.         GOSUB forderungstextfeld
  12047.       ENDIF
  12048.     ladenende:
  12049.       '
  12050.     CASE ddazulad&  ! Menüpunkt DAZULADEN
  12051.       DEFMOUSE 0
  12052.       GOSUB freiezeilefinden(1,freiezeile%)
  12053.       IF freiezeile%=1
  12054.         ' Abbrechen wenn keine Fdg-berechnung im Speicher ist
  12055.         ~@rsc_alert(1,"Anwahl des Menüpunktes|'Dazuladen' ist sinnlos|Wählen Sie 'laden'."," [OK ",1)
  12056.         GOTO menu_abarbeiten_ende
  12057.       ENDIF
  12058.       GOSUB altergebniszeileloeschen(freiezeile%-1)
  12059.       GOSUB diskladen("")
  12060.       IF diskladenabbruch%=FALSE  ! Also erfolgreich geladen wurde
  12061.         GOSUB az(az$)
  12062.         GOSUB falleingaben
  12063.         GOSUB zustelldatum_pruefen
  12064.         GOSUB nachdatensortieren
  12065.         GOSUB neuberechnung(1)
  12066.         aufstellungsaenderung#=TRUE
  12067.       ENDIF
  12068.       GOSUB forderungstextfeld
  12069.       '
  12070.     CASE dspeich&  ! Menüpunkt SPEICHERN
  12071.       DEFMOUSE 2
  12072.       GOSUB diskspeichern
  12073.       DEFMOUSE 0
  12074.       '
  12075.     CASE dkurzdr&  ! Menüpunkt KURZDRUCK
  12076.       GOSUB kurzdruck
  12077.       DEFMOUSE 0
  12078.       '
  12079.     CASE dzvdruck&  ! Menüpunkt ZV-AUSDRUCK
  12080.       DEFMOUSE 0
  12081.       GOSUB freiezeilefinden(1,freiezeile%)
  12082.       IF freiezeile%=1 OR fdgart#(1)=25 ! also endsummenzeile==> kein Eintrag da
  12083.         ~@rsc_alert(1,"Es ist keine Forderungs-|berechnung im Speicher !"," [OK ",1)
  12084.         GOTO zvausdruckende
  12085.       ENDIF
  12086.       GOSUB druck
  12087.     zvausdruckende:
  12088.       '
  12089.     CASE dende&  ! Menüpunkt ENDE
  12090.       DEFMOUSE 0
  12091.       GOSUB global_exit
  12092.       '
  12093.     ENDSELECT  ! Ende der MenuEINTRAGselektierung innerhalb des Titels DATEI
  12094.     '
  12095.     ' ============================
  12096.   CASE mahnverf&  ! MENUTITEL MAHNVERFAHREN
  12097.     SELECT menuitem&
  12098.       '
  12099.     CASE mmb&  ! Menüpunkt MAHNBESCHEID
  12100.       DEFMOUSE 0
  12101.       @rsc_text(mbbaum1&,mb1ueberschrift&," Mahnbescheid erstellen ")
  12102.       @rsc_text(mbbaum2&,mb2ueberschrift&," Mahnbescheid erstellen ")
  12103.       GOSUB mahnbescheid(1)
  12104.       '
  12105.     CASE mvb&  ! Menüpunkt VOLLSTRECKUNGSBESCHEID
  12106.       DEFMOUSE 0
  12107.       GOSUB vb
  12108.       '
  12109.     CASE mcommb&  ! Menüpunkt COMPUTER-MAHNBESCHEID
  12110.       DEFMOUSE 0
  12111.       GOSUB computer_mb(1)  ! zu druckender Computer-MB
  12112.       '
  12113.     CASE mvoreinst&  ! Menüpunkt MB - Voreinstellungen
  12114.       DEFMOUSE 0
  12115.       GOSUB mb_voreinstellungen
  12116.       '
  12117.     CASE mmbmuster&  ! Menüpunkt MB - Muster anlegen
  12118.       DEFMOUSE 0
  12119.       @rsc_text(mbbaum1&,mb1ueberschrift&," Muster-MB anlegen ")
  12120.       @rsc_text(mbbaum2&,mb2ueberschrift&," Muster-MB anlegen ")
  12121.       GOSUB mahnbescheid(2)
  12122.       GOSUB mb_muster_speichern(TRUE)  ! TRUE: mit Fileselectbox
  12123.       '
  12124.     CASE mstandardmb&  ! Menüpunkt MB - Standard anlegen
  12125.       DEFMOUSE 0
  12126.       @rsc_text(mbbaum1&,mb1ueberschrift&," Standard-MB anlegen ")
  12127.       @rsc_text(mbbaum2&,mb2ueberschrift&," Standard-MB anlegen ")
  12128.       GOSUB mahnbescheid(3)
  12129.       GOSUB mb_muster_speichern(FALSE)  ! FALSE: ohne Fileselectbox
  12130.       '
  12131.     CASE mcmbmuster&  ! Menüpunkt CMB - Muster anlegen
  12132.       DEFMOUSE 0
  12133.       GOSUB computer_mb(2)
  12134.       '
  12135.     CASE mstandardcmb&  ! Menüpunkt CMB - Standard anlegen
  12136.       DEFMOUSE 0
  12137.       GOSUB computer_mb(3)
  12138.       '
  12139.     ENDSELECT  ! Ende der MenuEINTRAGselektierung innerhalb des Titels MAHNVERFAHREN
  12140.     '
  12141.     ' ============================
  12142.   CASE termine&  ! MENUTITEL TERMINE
  12143.     SELECT menuitem&
  12144.     CASE toeffnen&  ! Menüpunkt TERMINE ÖFFNEN
  12145.       DEFMOUSE 0
  12146.       GOSUB termine_laden
  12147.       CHAR{titles%+80}=" NR.  DATUM     HAUPTFDG    KOSTEN    ZINSEN  K-ZINS ANMERKUNGEN"
  12148.       @set_wind_line(2,3,titles%+80)  ! Entspricht infowindow
  12149.       IF terminladenabbruch%=FALSE  ! Also erfolgreich geladen wurde
  12150.         ' GOSUB
  12151.       ENDIF
  12152.       ' GOSUB termin_bildschirmaufstellung(1,20)
  12153.       '
  12154.     CASE tschlies&  ! Menüpunkt TERMINE SCHLIESSEN
  12155.       DEFMOUSE 2
  12156.       GOSUB termine_speichern
  12157.       DEFMOUSE 0
  12158.       '
  12159.     CASE teingebe&  ! Menüpunkt TERMINE EINGEBEN
  12160.       GOSUB termine_eingeben
  12161.       '
  12162.     CASE tloesch&  ! Menüpunkt TERMINE LÖSCHEN
  12163.       '    GOSUB termine_loeschen
  12164.       '
  12165.     CASE tselekt&  ! Menüpunkt TERMINE SELEKTIEREN
  12166.       GOSUB termine_selektieren
  12167.       '
  12168.     ENDSELECT  ! Ende der MenuEINTRAGselektierung innerhalb des Titels TERMINE
  12169.     '
  12170.     ' ==========================
  12171.   CASE standard&  ! Menütitel STANDARDS
  12172.     SELECT menuitem&
  12173.       '
  12174.     CASE skopien&  ! Menüpunkt KOPIENZAHL
  12175.       DEFMOUSE 0
  12176.       GOSUB kopien
  12177.       '
  12178.     CASE sformula&  ! Menüpunkt FORMULAR
  12179.       DEFMOUSE 0
  12180.       GOSUB formular
  12181.       '
  12182.     CASE sfkey&  ! Menüpunkt STANDARDADRESSAT
  12183.       DEFMOUSE 0
  12184.       GOSUB funktionstasten
  12185.       '
  12186.     CASE sstdadr&  ! Menüpunkt STANDARDADRESSAT
  12187.       DEFMOUSE 0
  12188.       GOSUB standardadressat
  12189.       '
  12190.     CASE svoreins&  ! Menüpunkt VOREINSTELLUNGEN
  12191.       DEFMOUSE 0
  12192.       GOSUB voreinstellungen
  12193.       '
  12194.     CASE sdiskont&  ! Menüpunkt Diskontsätze
  12195.       DEFMOUSE 0
  12196.       GOSUB diskontsaetze_eingeben
  12197.       '
  12198.     CASE sspeicher&  ! Menüpunkt Speichereinteilung
  12199.       DEFMOUSE 0
  12200.       GOSUB speichereinteilung
  12201.       '
  12202.     ENDSELECT  ! Ende der MenuEINTRAGselektierung innerhalb des Titels STANDARDS
  12203.     '
  12204.     ' =================================
  12205.   CASE extras&  ! Menütitel EXTRAS
  12206.     SELECT menuitem&
  12207.       '
  12208.     CASE edatenbank&  ! Menüpunkt DATENBANK
  12209.       DEFMOUSE 0
  12210.       @select(rsc_adr%(datenbankbaum&),dbkdatensatz&,TRUE)  ! Zeilennrbutton als Zeichen für Neueingabe
  12211.       GOSUB datenbank("",-1,-1,1)
  12212.       '
  12213.     CASE edbdazuladen&  ! Menüpunkt DATENBANK
  12214.       DEFMOUSE 0
  12215.       @datenbank_dazuladen
  12216.       '
  12217.     CASE ezinsre&  ! Menüpunkt ZINSRECHNER
  12218.       DEFMOUSE 0
  12219.       GOSUB zinsrechner
  12220.       '
  12221.     CASE egebrechner&  ! Menüpunkt ZINSRECHNER
  12222.       DEFMOUSE 0
  12223.       GOSUB gebuehrenrechner
  12224.       '
  12225.     CASE eordner&  ! Menüpunkt ORDNER ANLEGEN
  12226.       DEFMOUSE 0
  12227.       GOSUB ordner_anlegen
  12228.       '
  12229.     CASE edatloes&  ! Menüpunkt DATEI LÖSCHEN
  12230.       DEFMOUSE 0
  12231.       GOSUB datei_loeschen
  12232.       '
  12233.     CASE eoverlay&  ! Menüpunkt Overlay senden
  12234.       DEFMOUSE 0
  12235.       GOSUB overlay
  12236.       '
  12237.     CASE edrckanp&  ! Menüpunkt DRUCKERANPASSUNG
  12238.       DEFMOUSE 0
  12239.       GOSUB druckeranpassung
  12240.       '
  12241.     CASE edruckport&  ! Menüpunkt DRUCKPORT
  12242.       DEFMOUSE 0
  12243.       GOSUB druckport_festlegen
  12244.       '
  12245.     CASE edrcktst&  ! Menüpunkt DRUCKERTEST
  12246.       DEFMOUSE 0
  12247.       GOSUB druckertest
  12248.       '
  12249.     CASE edialpos&  ! Menüpunkt DIALOGPOSITIONEN
  12250.       DEFMOUSE 0
  12251.       GOSUB dialogeinstellungen
  12252.       '
  12253.     CASE edateikonvert&  ! Menüpunkt DIALOGPOSITIONEN
  12254.       DEFMOUSE 0
  12255.       GOSUB dateikonvertierung
  12256.       '
  12257.     ENDSELECT  ! Ende der MenuEINTRAGselektierung innerhalb des Titels EXTRAS
  12258.   ENDSELECT ! Ende der Selektierung der MENÜTITEL
  12259. menu_abarbeiten_ende:
  12260.   ~MENU_TNORMAL(gc_menutree%,menutitle&,1)
  12261. RETURN
  12262. ' *********************************************************************
  12263. > PROCEDURE key_event
  12264.   @key_evaluation(MENU(13),MENU(14))
  12265. RETURN
  12266. ' ********************************************************************
  12267. > PROCEDURE key_evaluation(ks&,kr&)
  12268.   LOCAL title&,item&
  12269.   LOCAL ascii|,shift!,control!,alt!
  12270.   '
  12271.   ascii|=BYTE(kr&)                                  ! ASCII-Code
  12272.   scan|=BYTE(SHR(kr&,8))                            ! SCAN-Code
  12273.   '
  12274.   shift!=AND(ks&,&X11)                             ! SHIFT gedrückt
  12275.   control!=BTST(ks&,2)                             ! CONTROL gedrückt
  12276.   alt!=BTST(ks&,3)                                 ! ALTERNATE gedrückt
  12277.   '
  12278.   ' ==============
  12279.   ' MENU - SHORTCUTS
  12280.   ' ==============
  12281.   '
  12282.   item&=@rsc_shortcut(h_menu&,scan|,ks&,title&)
  12283.   IF item&
  12284.     ' tree&      : Index des Menübaumes
  12285.     ' scan|      : SCAN-Code der gedrückten Taste
  12286.     ' shift&     : Status der tastaturumschalttasten
  12287.     ' VAR title& : Bei Erfolg Objektnummer des Menütitels
  12288.     ~MENU_TNORMAL(gc_menutree%,title&,0)
  12289.     @menu_evaluation(title&,item&)
  12290.   ELSE
  12291.     ' hier Auswertung von nicht-Menü-Tastaturcodes:
  12292.     '
  12293.     ' ==============
  12294.     ' F - TASTEN
  12295.     ' ==============
  12296.     IF ascii|=0  ! Z.B. BEI F-Tasten
  12297.       SELECT kr&
  12298.       CASE 15104  ! Normal F1
  12299.         @f_tasten_aktion(1)
  12300.       CASE 21504  ! Shift F1
  12301.         @f_tasten_aktion(11)
  12302.       CASE 15360  ! Normal F2
  12303.         @f_tasten_aktion(2)
  12304.       CASE 21760  ! Shift F2
  12305.         @f_tasten_aktion(12)
  12306.       CASE 15616  ! Normal F3
  12307.         @f_tasten_aktion(3)
  12308.       CASE 22016  ! Shift F3
  12309.         @f_tasten_aktion(13)
  12310.       CASE 15872  ! Normal F4
  12311.         @f_tasten_aktion(4)
  12312.       CASE 22272  ! Shift F4
  12313.         @f_tasten_aktion(14)
  12314.       CASE 16128  ! Normal F5
  12315.         @f_tasten_aktion(5)
  12316.       CASE 22528  ! Shift F5
  12317.         @f_tasten_aktion(15)
  12318.       CASE 16384  ! Normal F6
  12319.         @f_tasten_aktion(6)
  12320.       CASE 22784  ! Shift F6
  12321.         @f_tasten_aktion(16)
  12322.       CASE 16640  ! Normal F7
  12323.         @f_tasten_aktion(7)
  12324.       CASE 23040  ! Shift F7
  12325.         @f_tasten_aktion(17)
  12326.       CASE 16896  ! Normal F8
  12327.         @f_tasten_aktion(8)
  12328.       CASE 23296  ! Shift F8
  12329.         @f_tasten_aktion(18)
  12330.       CASE 17152  ! Normal F9
  12331.         @f_tasten_aktion(9)
  12332.       CASE 23552  ! Shift F9
  12333.         @f_tasten_aktion(19)
  12334.       CASE 17408  ! Normal F10
  12335.         @f_tasten_aktion(10)
  12336.       CASE 23808  ! Shift F10
  12337.         @f_tasten_aktion(20)
  12338.       ENDSELECT
  12339.     ENDIF
  12340.     '
  12341.     ' ==============
  12342.     ' ANDERE TASTEN
  12343.     ' ==============
  12344.     '
  12345.     IF kr&=7181 AND ascii|=13   ! Return
  12346.     ENDIF
  12347.     '
  12348.     ' ================
  12349.     ' Cursorkommandos
  12350.     ' ===============
  12351.     '
  12352.     IF kr&=18432 AND control!=FALSE   ! ^
  12353.       @my_cursor("^",1)
  12354.       GOTO end_keyevent
  12355.     ELSE IF kr&=20480 AND control!=FALSE   ! v
  12356.       @my_cursor("v",1)
  12357.       GOTO end_keyevent
  12358.     ELSE IF kr&=19712 AND control!=FALSE   ! >
  12359.       @my_cursor(">",1)
  12360.       GOTO end_keyevent
  12361.     ELSE IF kr&=19200 AND control!=FALSE   ! <
  12362.       @my_cursor("<",1)
  12363.       GOTO end_keyevent
  12364.     ELSE IF kr&=18231 AND ascii|=55   ! Shift+Home
  12365.       @my_cursor("BOTTOM",0)
  12366.       GOTO end_keyevent
  12367.     ELSE IF kr&=18176 AND ascii|=0   ! Home
  12368.       @my_cursor("TOP",0)
  12369.       GOTO end_keyevent
  12370.     ELSE IF kr&=18488 AND ascii|=56    ! Shift+^
  12371.       @my_cursor("PG^",0)
  12372.       GOTO end_keyevent
  12373.     ELSE IF kr&=20530 AND ascii|=50    ! Shift+v
  12374.       @my_cursor("PGv",0)
  12375.       GOTO end_keyevent
  12376.     ELSE IF kr&=19766 AND ascii|=54    ! Shift+>
  12377.       @my_cursor("PG>",0)
  12378.       GOTO end_keyevent
  12379.     ELSE IF kr&=19252 AND ascii|=52    ! Shift+<
  12380.       @my_cursor("PG<",0)
  12381.       GOTO end_keyevent
  12382.     ELSE IF kr&=18432 AND control!=TRUE    ! Ctrl+^
  12383.       @my_cursor("^",4)
  12384.       GOTO end_keyevent
  12385.     ELSE IF kr&=20480 AND control!=TRUE    ! Ctrl+v
  12386.       @my_cursor("v",4)
  12387.       GOTO end_keyevent
  12388.     ELSE IF kr&=29696 AND control!=TRUE    ! Ctrl+>
  12389.       @my_cursor("WD>",0)
  12390.       GOTO end_keyevent
  12391.     ELSE IF kr&=29440 AND control!=TRUE    ! Ctrl+<
  12392.       @my_cursor("WD<",0)
  12393.       GOTO end_keyevent
  12394.     ENDIF
  12395.   ENDIF
  12396. end_keyevent:
  12397. RETURN
  12398. ' **********************************************************************
  12399. > PROCEDURE main_exit
  12400.   @delete_wind(-1) ! alle Fensterhandles freigeben, wenn nötig Fenster schließen
  12401.   ' Menue abschalten (ganz, ganz wichtig!)
  12402.   ~MENU_BAR(gc_menutree%,0)
  12403. RETURN
  12404. ' ******************************************************************************
  12405. > FUNCTION treeaddress(tree&)
  12406.   LOCAL address%
  12407.   ~RSRC_GADDR(0,tree&,address%)
  12408.   RETURN address%
  12409. ENDFUNC
  12410. ' ****************************************************************************+
  12411. > PROCEDURE select(tree%,obj&,bool!)
  12412.   IF bool!
  12413.     OB_STATE(tree%,obj&)=BSET(OB_STATE(tree%,obj&),0)
  12414.   ELSE
  12415.     OB_STATE(tree%,obj&)=BCLR(OB_STATE(tree%,obj&),0)
  12416.   ENDIF
  12417. RETURN
  12418. ' **********************************************************************
  12419. DEFFN selected(tree%,obj&)=BTST(OB_STATE(tree%,obj&),0)
  12420. ' **********************************************************************
  12421. DEFFN touchexit(tree%,obj&)=BTST(OB_FLAGS(tree%,obj&),6)
  12422. ' ***********************************************************************
  12423. '
  12424. '
  12425. '
  12426. ' ************************************************************************
  12427. ' **              Winlib (c) 1993 by sm Version 0.99                    **
  12428. ' ************************************************************************
  12429. ' ####  vom Programmierer zu füllen/ergänzen/ändern:
  12430. > PROCEDURE clipbrd_search
  12431.   ' vom Programmierer auszufüllen; man sollte hier
  12432.   ' nachschauen, ob das Clipboard ne interessante Datei enthält
  12433.   ' (zB per exist() nach Dateien suchen)
  12434.   ' Erstens wird diese Routine aufgerufen, wenn ein Fenster _durch Anklicken_
  12435.   ' getoppt wird.
  12436.   ' Zweitens wird diese Routine aufgerufen, wenn das oberste Fenster der
  12437.   ' Applikation eine Redraw-Nachricht erhält: das is dann der Fall, wenn
  12438.   ' ein Fenster/Dialog über diesem lag oder direkt nach dem
  12439.   ' Öffnen.
  12440.   ' Ein Test IF @clipbrd_path$<>"" ist nicht nötig!
  12441.   IF EXIST(@clipbrd_path$+"SCRAP.TXT")
  12442.     clip!=TRUE
  12443.   ELSE
  12444.     clip!=FALSE
  12445.   ENDIF
  12446.   @redraw_programmer(0,0,FALSE,5,0,1,0)  ! Klemmbrett-Icon zeichnen
  12447. RETURN
  12448. > PROCEDURE close_window(nr&)
  12449.   ' ev. vom Programmierer zu ergänzen, s.u.
  12450.   '
  12451.   ' Hier kann man einen Programm-Ende-Aufruf beim Schliessen
  12452.   ' eines bestimmten Fensters einbauen. ZB, wenn bei Fenster 1 dies
  12453.   ' bewirkt werden soll:
  12454.   ' if nr&=1
  12455.   '   ende ! Aufruf der Programmende-Prozedur
  12456.   ' endif
  12457.   '
  12458.   @delete_wind(nr&)   ! da man beim Schließen auch
  12459.   '                     das AES-Handle freigeben sollte (damit der Anwender
  12460.   '                     durch Schließen eines Fensters die Möglichkeit
  12461.   '                     erhält, ein anderes zu öffnen ...). delete_wind()
  12462.   '                     erledigt das Schließen mit.
  12463. RETURN
  12464. > PROCEDURE fill_window(nr&,which&,x&,y&,w&,h&,xc%,yc1%,wc%,yc2%,xoff%,yoff%)
  12465.   ' wird zum Füllen von Fenstern und zur Button-Auswertung aufgerufen
  12466.   ' Unterscheidung über which:
  12467.   ' which: beim Füllen: 0 Inhalt, 1 horizontal Box, 2 vertikale Box
  12468.   '        beim Buttonauswerten: 10 Inhalt, 11 hor. Box, 12 vert. Box
  12469.   ' nr: Fensternummer
  12470.   ' beim Füllen:
  12471.   '  x: linke x-Koordinate des neu zu zeichnenden Bereiches absolut
  12472.   '  y: obere y-Koordinate des neu zu zeichnenden Bereiches absolut
  12473.   '  w: Breite des neu zu zeichnenden Bereiches absolut
  12474.   '  h: Höhe des neu zu zeichnenden Bereiches absolut
  12475.   '  xc: x-Koordinate des neu zu zeichnenden Bereichs in Zellenzählung
  12476.   '  yc1: obere y-Koordinate des neu zu zeichnenden Bereichs in Zellenzählung
  12477.   '  wc: Breite des neu zu zeichnenden Bereichs in Zellenzählung
  12478.   '  yc2: untere y-Koordinate des neu zu zeichnenden Bereichs in Zellenzählung
  12479.   ' beim Buttonauswerten:
  12480.   '  x: x-Koordinate des Klicks absolut
  12481.   '  y: y-Koordinate des Klicks absolut
  12482.   '  w: gedrückte Maustaste (Bitvektor)
  12483.   '  h: Anzahl der Mausklicks
  12484.   '  xc: x-Koordinate des Klicks in Zellenzählung
  12485.   '  yc1: y-Koordinate des Klicks in Zellenzählung
  12486.   '  wc: immer 1
  12487.   '  yc2: wie yc1
  12488.   ' xoff: x-Offset der absoluten Koordinaten zum Fensterinhalt
  12489.   ' yoff: y-Offset der absoluten Koordinaten zum Fensterinhalt
  12490.   '
  12491.   LOCAL x1%,y1%,w1%,h1%,i%,i&,a$,mk&,no&
  12492.   '
  12493.   IF which&>9  ! Buttonauswerten
  12494.     mk&=w&
  12495.     no&=h&
  12496.     w&=1
  12497.     h&=1
  12498.   ENDIF
  12499.   '
  12500.   IF which&=11  ! Box1-Klick auf  für alle Fenster testen
  12501.     x1%=0+xoff%
  12502.     y1%=0+yoff%
  12503.     w1%=2*charw&
  12504.     h1%=charh&
  12505.     IF @rect_intersect(x&,y&,w&,h&,x1%,y1%,w1%,h1%)
  12506.       '      @prompt("Win"+STR$(nr&)+"/ angeklickt, x="+STR$(xc%)+", k="+STR$(mk&)+", n="+STR$(no&))
  12507.       GOTO end_fill_window
  12508.     ENDIF
  12509.   ENDIF
  12510.   '
  12511.   SELECT nr&  ! Fensternummer
  12512.   CASE 0  ! Textfenster mit Forderungsberechnung
  12513.     SELECT which&
  12514.     CASE 1,11  ! horizontal
  12515.       IF yc1%<2
  12516.         IF which&=1  ! füllen, horizontal
  12517.           GRAPHMODE 0
  12518.           x1%=charw&*xc%+xoff%
  12519.           y1%=charh&*yc1%+yoff%-(charh&-charpixh&)
  12520.           FOR i%=yc1% TO MIN(1,yc2%)
  12521.             a$=LEFT$(MID$(tinfo$(i%),SUCC(xc%),wc%)+SPACE$(wc%),wc%) ! SUCC wg 0...x
  12522.             TEXT x1%,ADD(y1%,charh&),a$
  12523.             ADD y1%,charh&
  12524.           NEXT i%
  12525.         ELSE  ! Füllen, vertikal oder INHALT
  12526.           IF yc1%=0
  12527.             IF xc%>3
  12528.               '   @prompt("Win2/Pfad angeklickt, x="+STR$(xc%+4)+", k="+STR$(mk&)+", n="+STR$(no&))
  12529.             ENDIF
  12530.           ELSE IF yc1%=1
  12531.             ' @prompt("Win2/XY-Anz. angeklickt, x="+STR$(xc%)+", k="+STR$(mk&)+", n="+STR$(no&))
  12532.           ENDIF
  12533.         ENDIF
  12534.       ENDIF
  12535.       IF yc2%>1
  12536.         x1%=0+xoff%
  12537.         y1%=charh&*2+yoff%
  12538.         w1%=@win_workw(2)+@win_xoff(2)
  12539.         h1%=@win_yoff(2)/2
  12540.       ENDIF
  12541.     CASE 0  ! Füllen Inhalt
  12542.       GRAPHMODE 0
  12543.       x1%=charw&*xc%+xoff%
  12544.       y1%=charh&*yc1%+yoff%-(charh&-charpixh&)
  12545.       IF yc1%<0  ! einghefügt, weil z. T. yc1 negativ war !!! (neg. Feldindex)
  12546.         yc2%=yc2%+ABS(yc1%)
  12547.         yc1%=0
  12548.       ENDIF
  12549.       xc%=MAX(xc%,0)  ! Da z.T. neg. Zahlen übergeben wurden
  12550.       FOR i%=yc1% TO yc2%
  12551.         SELECT fdgart#((i%+2))  ! +2 da alle um 1 verschoben ist, weil fdgtxt$() erst bei index 1 loslegt
  12552.         CASE 20,22,25
  12553.           DEFTEXT ,8,,,
  12554.         DEFAULT
  12555.           DEFTEXT ,0,,,
  12556.         ENDSELECT
  12557.         a$=LEFT$(MID$(fdgtxt$(i%+1),SUCC(xc%),wc%)+SPACE$(wc%),wc%) ! SUCC wg 0...x
  12558.         TEXT x1%,ADD(y1%,charh&),a$
  12559.         ADD y1%,charh&
  12560.       NEXT i%
  12561.     CASE 10
  12562.       '      @prompt("Win2/Inhalt angeklickt, x="+STR$(xc%)+", y="+STR$(yc1%)+", k="+STR$(mk&)+", n="+STR$(no&))
  12563.     ENDSELECT
  12564.     '
  12565.   ENDSELECT
  12566. end_fill_window:
  12567. RETURN
  12568. > PROCEDURE handle_xmsg
  12569.   ' Wenn window_event eine AES-Message nicht erkennt, wird
  12570.   ' diese Prozedur aufgerufen. Hier kann man also zB Messages des
  12571.   ' AV/VA- oder des XAcc-Protokolls abhandeln
  12572.   '
  12573.   ' Im unteren Beispiel wird das Empfangen von Tastendrücken mittels
  12574.   ' AV_SENDKEY ermöglicht. Zum Testen zB Clock (von Stefan Hintz) geeignet.
  12575.   '
  12576.   LOCAL help$,apid&,prgname%
  12577.   '
  12578. ' ## INLINE:
  12579. ' $0000: 54 45 53 54 20 20 20 20 00 00 
  12580. ' 10  Bytes.
  12581.   INLINE prgname%,9
  12582.   CHAR{prgname%}="TEST    "   ! immer 8 Zeichen!!!
  12583.   '
  12584.   IF MENU(1)=&H4700                  ! AV_PROTOKOLL
  12585.     help$=CHAR{CARD(MENU(7))*65536+CARD(MENU(8))}  ! Namen holen, Word 6+7
  12586.     apid&=APPL_FIND(help$)
  12587.     '
  12588.     ' antworten:
  12589.     help$=STRING$(16,0)
  12590.     WORD{V:help$}=&H4701             ! VA_PROTOSTATUS, Word 0
  12591.     WORD{V:help$+2}=0                ! Word 1
  12592.     WORD{V:help$+4}=0                ! Word 2
  12593.     WORD{V:help$+6}=1                ! Word 3  nur AV_SENDKEY
  12594.     WORD{V:help$+8}=0                ! Word 4
  12595.     WORD{V:help$+10}=0               ! Word 5
  12596.     WORD{V:help$+12}=WORD(prgname% DIV 65536) ! Word 6
  12597.     WORD{V:help$+14}=WORD(prgname% MOD 65536) ! Word 7
  12598.     ~APPL_WRITE(apid&,16,V:help$)
  12599.   ENDIF
  12600.   IF MENU(1)=&H4710                  ! AV_SENDKEY
  12601.     @key_evaluation(MENU(4),MENU(5))
  12602.   ENDIF
  12603. RETURN
  12604. > PROCEDURE new_curpos(nr&)
  12605.   ' diese Prozedur wird von der Winlib aufgerufen, wenn die Cursorposition im
  12606.   ' Fenster nr sich durch a) Aufruf von open_wind() oder b) durch Anklicken
  12607.   ' der entsprechenden Fensterelemente geändert hat
  12608.   '
  12609. RETURN
  12610. > PROCEDURE winlib_alert(alert$)
  12611.   ' Diese Prozedur kann vom Programmierer an seinen Bedarf angepaßt werden,
  12612.   ' zB um alternative Alert-Routinen zu benutzen (zB die der MyDials)
  12613.   ~FORM_ALERT(1,alert$)  ! AES
  12614.   '  ~@my_do_alert(1,alert$)   ! MyDials
  12615. RETURN
  12616. ' #### Abfragen:
  12617. > FUNCTION clipbrd_path$           ! leer oder immer "\" am Ende, STRING
  12618.   RETURN winlib_clippath$
  12619. ENDFUNC
  12620. > FUNCTION rect_intersect(x&,y&,w&,h&,x%,y%,w%,h%)              ! BOOLEAN
  12621.   $F%
  12622.   ' überschneiden sich die Rechtecke im (eventuell) sichtbaren Bereich
  12623.   ' und liegen die LONG-Koordinaten im WORD-Bereich?
  12624.   ' ja: TRUE, nein: FALSE.
  12625.   ' Trotz namentlicher Ähnlichkeit unterscheidet sich die Funktion von
  12626.   ' RC_INTERSECT deutlich:
  12627.   ' 1. verändert sie die eingegebenen Koordinaten nicht (absichtlich)
  12628.   ' 2. darf das 2. der Rechtecke aus LONG-Koordinaten 'bestehen'
  12629.   IF @size_in_word_range(x%,y%,w%,h%)
  12630.     RETURN RC_INTERSECT(x%,y%,w%,h%,x&,y&,w&,h&)
  12631.   ELSE
  12632.     RETURN FALSE
  12633.   ENDIF
  12634. ENDFUNC
  12635. > FUNCTION win_bottom                                           ! WORD
  12636.   $F%
  12637.   ' gibt nr des untersten Fensters zurück
  12638.   LOCAL i&
  12639.   FOR i&=0 TO winlib_nr&
  12640.     IF winlib_rank&(i&)>-1
  12641.       IF winlib_on_screen!(winlib_rank&(i&))
  12642.         RETURN winlib_rank&(i&)
  12643.       ENDIF
  12644.     ENDIF
  12645.   NEXT i&
  12646.   RETURN -1
  12647. ENDFUNC
  12648. DEFFN win_cellh(nr&)=winlib_cell_h&(nr&)                        ! WORD
  12649. DEFFN win_cellw(nr&)=winlib_cell_w&(nr&)                        ! WORD
  12650. > FUNCTION win_find(x&,y&,VAR nr&)                              ! BOOLEAN
  12651.   $F%
  12652.   ' befindet sich an Position x,y (absolut) eines meiner Fenster?
  12653.   ' ja: TRUE, nein: FALSE; in nr Rückgabe der Fensterkennung
  12654.   LOCAL gem_handle&
  12655.   gem_handle&=WIND_FIND(x&,y&)
  12656.   RETURN @mywindow(gem_handle&,nr&)
  12657. ENDFUNC
  12658. > PROCEDURE win_get_cur_xy(nr&,VAR x%,y%)
  12659.   ' gibt Cursorposition von Fenster nr in x,y zurück
  12660.   x%=ADD(winlib_curx&(nr&),DIV(winlib_hor_off%(nr&),winlib_cell_w&(nr&)))
  12661.   y%=ADD(winlib_cury&(nr&),DIV(winlib_ver_off%(nr&),winlib_cell_h&(nr&)))
  12662. RETURN
  12663. > FUNCTION win_get_virt_coords(nr&,VAR vx%,vy%,vw%,vh%)         ! BOOLEAN
  12664.   $F%
  12665.   ' gibt Außen-Koordinaten des Fensters nr im virtuellen (1-1000000)
  12666.   ' Koordinatensystem in vx,vy,vw,vh zurück
  12667.   ' Wenn das Fenster noch nie geöffnet war, werden vx,vy,vw,vh
  12668.   ' nicht verändert; hat man beim Aufruf diese nicht vordefiniert, sind
  12669.   ' sie nachher also weiter undefiniert -> Garbage in, Garbage out
  12670.   ' Die Funktion liefert in diesem Fall FALSE, ansonsten TRUE
  12671.   LOCAL x&,y&,w&,h&,back!
  12672.   back!=FALSE
  12673.   IF winlib_handles&(nr&)>-1
  12674.     IF winlib_on_screen!(nr&)  ! nötig
  12675.       ~WIND_GET(winlib_handles&(nr&),5,x&,y&,w&,h&)
  12676.       back!=TRUE
  12677.     ELSE IF winlib_last_x&(nr&)>-1
  12678.       x&=winlib_last_x&(nr&)
  12679.       y&=winlib_last_y&(nr&)
  12680.       w&=winlib_last_w&(nr&)
  12681.       h&=winlib_last_h&(nr&)
  12682.       back!=TRUE
  12683.     ENDIF
  12684.     IF back!
  12685.       vx%=ROUND((CFLOAT(SUB(x&,winlib_dx&))/winlib_dw&)*1E+06)
  12686.       vy%=ROUND((CFLOAT(SUB(y&,winlib_dy&))/winlib_dh&)*1E+06)
  12687.       vw%=ROUND((CFLOAT(w&)/winlib_dw&)*1E+06)
  12688.       vh%=ROUND((CFLOAT(h&)/winlib_dh&)*1E+06)
  12689.       IF NOT winlib_on_screen!(nr&)
  12690.         vx%=-(vx%+1)
  12691.       ENDIF
  12692.     ENDIF
  12693.   ENDIF
  12694.   RETURN back!
  12695. ENDFUNC
  12696. DEFFN win_hor(nr&)=winlib_hor_off%(nr&)                         ! LONG
  12697. DEFFN win_off_screen(nr&)=NOT winlib_on_screen!(nr&)            ! BOOLEAN
  12698. DEFFN win_rank(rank&)=winlib_rank&(rank&)                       ! WORD
  12699. DEFFN win_top=winlib_curtop&                                    ! WORD
  12700. > FUNCTION win_topabs(nr&)                                      ! BOOLEAN
  12701.   $F%
  12702.   ' ist das Fenster nr das (absolut) oberste? ja: TRUE, nein: FALSE
  12703.   LOCAL hand&,dummy&
  12704.   ~WIND_GET(0,10,hand&,dummy&,dummy&,dummy&)
  12705.   IF winlib_handles&(nr&)=hand&
  12706.     RETURN TRUE
  12707.   ELSE
  12708.     RETURN FALSE
  12709.   ENDIF
  12710. ENDFUNC
  12711. DEFFN win_ver(nr&)=winlib_ver_off%(nr&)                         ! LONG
  12712. DEFFN win_workw(nr&)=SUB(winlib_w%(nr&),winlib_x_off&(nr&))     ! LONG
  12713. DEFFN win_workh(nr&)=SUB(winlib_h%(nr&),winlib_y_off&(nr&))     ! LONG
  12714. DEFFN win_xoff(nr&)=winlib_x_off&(nr&)                          ! WORD
  12715. DEFFN win_yoff(nr&)=winlib_y_off&(nr&)                          ! WORD
  12716. '
  12717. ' #### vom Programmierer benutzbare Procs/Funcs:
  12718. > FUNCTION cursor_set(nr&,x%,y%)
  12719.   LOCAL xa%,ya%,back!
  12720.   back!=FALSE
  12721.   IF winlib_handles&(nr&)>0
  12722.     IF winlib_on_screen!(nr&)
  12723.       xa%=winlib_curx&(nr&)+DIV(winlib_hor_off%(nr&),winlib_cell_w&(nr&))
  12724.       ya%=winlib_cury&(nr&)+DIV(winlib_ver_off%(nr&),winlib_cell_h&(nr&))
  12725.       SUB x%,xa%
  12726.       SUB y%,ya%
  12727.       IF x%>0
  12728.         back!=@cursor_wind(nr&,">",x%)
  12729.       ELSE IF x%<0
  12730.         back!=@cursor_wind(nr&,"<",-x%)
  12731.       ENDIF
  12732.       IF y%>0
  12733.         back!=back! OR @cursor_wind(nr&,"v",y%)
  12734.       ELSE IF y%<0
  12735.         back!=back! OR @cursor_wind(nr&,"^",-y%)
  12736.       ENDIF
  12737.     ENDIF
  12738.   ENDIF
  12739.   RETURN back!
  12740. ENDFUNC
  12741. > FUNCTION cursor_wind(nr&,msg$,no%)
  12742.   LOCAL x&,y&,w&,h&,newcur%,currange&
  12743.   IF winlib_handles&(nr&)>0
  12744.     IF winlib_on_screen!(nr&)
  12745.       ~WIND_GET(winlib_handles&(nr&),4,x&,y&,w&,h&)
  12746.       IF msg$="TOP"
  12747.         RETURN @cursor_set(nr&,0,0)
  12748.       ELSE IF msg$="BOTTOM"
  12749.         RETURN @cursor_set(nr&,winlib_w%(nr&),winlib_h%(nr&))
  12750.       ELSE IF msg$="^"
  12751.         IF BTST(winlib_flags%(nr&),1)
  12752.           newcur%=winlib_cury&(nr&)-no%
  12753.         ELSE
  12754.           newcur%=-no%
  12755.         ENDIF
  12756.         IF newcur%<0
  12757.           IF ADD(winlib_cury&(nr&),winlib_ver_off%(nr&))>0
  12758.             ~@arrow_wind(nr&,FALSE,"^",-newcur%)
  12759.             @redraw_wind(nr&,4,FALSE,winlib_curx&(nr&),0,0,0)
  12760.             RETURN TRUE
  12761.           ENDIF
  12762.           RETURN FALSE
  12763.         ELSE
  12764.           @redraw_wind(nr&,4,FALSE,winlib_curx&(nr&),newcur%,0,0)
  12765.           RETURN TRUE
  12766.         ENDIF
  12767.       ELSE IF msg$="v"
  12768.         currange&=PRED(DIV(h&-winlib_y_off&(nr&),winlib_cell_h&(nr&)))
  12769.         IF BTST(winlib_flags%(nr&),1)
  12770.           newcur%=winlib_cury&(nr&)+no%
  12771.         ELSE
  12772.           newcur%=currange&+no%
  12773.         ENDIF
  12774.         IF newcur%>currange&
  12775.           IF @arrow_wind(nr&,FALSE,"v",newcur%-currange&)
  12776.             @redraw_wind(nr&,4,FALSE,winlib_curx&(nr&),currange&,0,0)
  12777.             RETURN TRUE
  12778.           ENDIF
  12779.           RETURN FALSE
  12780.         ELSE
  12781.           @redraw_wind(nr&,4,FALSE,winlib_curx&(nr&),newcur%,0,0)
  12782.           RETURN TRUE
  12783.         ENDIF
  12784.       ELSE IF msg$="<"
  12785.         IF BTST(winlib_flags%(nr&),1)
  12786.           newcur%=winlib_curx&(nr&)-no%
  12787.         ELSE
  12788.           newcur%=-no%
  12789.         ENDIF
  12790.         IF newcur%<0
  12791.           IF ADD(winlib_curx&(nr&),winlib_hor_off%(nr&))>0
  12792.             ~@arrow_wind(nr&,FALSE,"<",-newcur%)
  12793.             @redraw_wind(nr&,4,FALSE,0,winlib_cury&(nr&),0,0)
  12794.             RETURN TRUE
  12795.           ENDIF
  12796.           RETURN FALSE
  12797.         ELSE
  12798.           @redraw_wind(nr&,4,FALSE,newcur%,winlib_cury&(nr&),0,0)
  12799.           RETURN TRUE
  12800.         ENDIF
  12801.       ELSE IF msg$=">"
  12802.         currange&=PRED(DIV(w&-winlib_x_off&(nr&),winlib_cell_w&(nr&)))
  12803.         IF BTST(winlib_flags%(nr&),1)
  12804.           newcur%=winlib_curx&(nr&)+no%
  12805.         ELSE
  12806.           newcur%=currange&+no%
  12807.         ENDIF
  12808.         IF newcur%>currange&
  12809.           IF @arrow_wind(nr&,FALSE,">",newcur%-currange&)
  12810.             @redraw_wind(nr&,4,FALSE,currange&,winlib_cury&(nr&),0,0)
  12811.             RETURN TRUE
  12812.           ENDIF
  12813.           RETURN FALSE
  12814.         ELSE
  12815.           @redraw_wind(nr&,4,FALSE,newcur%,winlib_cury&(nr&),0,0)
  12816.           RETURN TRUE
  12817.         ENDIF
  12818.       ELSE IF msg$="PG>"
  12819.         currange&=PRED(DIV(w&-winlib_x_off&(nr&),winlib_cell_w&(nr&)))
  12820.         RETURN @cursor_wind(nr&,">",currange&+no%)  ! Rekursion is
  12821.       ELSE IF msg$="PG<"
  12822.         currange&=PRED(DIV(w&-winlib_x_off&(nr&),winlib_cell_w&(nr&)))
  12823.         RETURN @cursor_wind(nr&,"<",currange&+no%)  ! manchmal
  12824.       ELSE IF msg$="PGv"
  12825.         currange&=PRED(DIV(h&-winlib_y_off&(nr&),winlib_cell_h&(nr&)))
  12826.         RETURN @cursor_wind(nr&,"v",currange&+no%)  ! wirklich
  12827.       ELSE IF msg$="PG^"
  12828.         currange&=PRED(DIV(h&-winlib_y_off&(nr&),winlib_cell_h&(nr&)))
  12829.         RETURN @cursor_wind(nr&,"^",currange&+no%)  ! töfte ;-)
  12830.       ENDIF
  12831.     ENDIF
  12832.   ENDIF
  12833.   RETURN FALSE
  12834. ENDFUNC
  12835. > PROCEDURE define_wind(nr&,attr&,x%,y%,w%,h%,cellw&,cellh&,x_off&,y_off&,alert$,flags%)
  12836.   LOCAL x&,y&,w&,h&,xx&,yy&,ww&,hh&,dummy&,i&
  12837.   ' Bedeutung der Parameter:
  12838.   ' nr: Fensternummer (programminterne Kennung)
  12839.   ' attr: Attribute
  12840.   ' x: x-Koordinate des Fensters (virtuell, 0-1.000.000)
  12841.   ' y: y-Koordinate des Fensters (virtuell, 0-1.000.000)
  12842.   ' w: gewünschte Breite des Arbeitsbereichs (absolut)
  12843.   ' h: gewünschte Höhe des Arbeitsbereichs (absolut)
  12844.   ' cellw: Breite der Zellen im Fenster (abs.)
  12845.   ' cellh: Höhe der Zellen im Fenster (abs.)
  12846.   ' x_off: Höhe des oberen 'Info'-Bereichs (abs.)         Diese beiden:
  12847.   ' y_off: Breite des linken 'Info'-Bereichs (abs.)    nicht zu groß wählen!
  12848.   ' alert$: String für form_alert; wenn dieser leer ist ("") und der
  12849.   '         bei init_winlib() angegebene nicht leer, wird letzterer ausgegeben,
  12850.   '         wenn kein Handle mehr frei ist, ansonsten dieser - es sei
  12851.   '         denn, der hier angegebene String ist "NO", dann wird garnix
  12852.   '         ausgegeben
  12853.   ' flags: 31 (!!!) Bits für diverse Zwecke (künftige Erweiterungen, Parameter)
  12854.   '        Bit 0: Scrollen soweit möglich über VDI-Copy-Raster-Funktionen
  12855.   '        Bit 1: im Fenster wird ein Cursor dargestellt
  12856.   '        Bit 2: Fenster kann nicht durch Anklicken getoppt werden
  12857.   ' zur Erinnerung / Attributbits:
  12858.   ' 0: NAME, 1: CLOSE, 2: FULL, 3: MOVE, 4: INFO, 5: SIZE
  12859.   ' 6: UPARROW, 7: DNARROW, 8: VSLIDE, 9: LFARROW, A: RTARROW, B: HSLIDE
  12860.   '
  12861.   IF winlib_handles&(nr&)<0   ! noch kein Handle
  12862.     winlib_cell_w&(nr&)=MAX(1,cellw&)
  12863.     winlib_cell_h&(nr&)=MAX(1,cellh&)
  12864.     winlib_min_w&(nr&)=MAX(0,cellw&)
  12865.     winlib_min_h&(nr&)=MAX(0,cellw&)
  12866.     winlib_x_off&(nr&)=MAX(0,x_off&)
  12867.     winlib_y_off&(nr&)=MAX(0,y_off&)
  12868.     winlib_flags%(nr&)=flags%
  12869.     '
  12870.     ADD w%,winlib_x_off&(nr&)
  12871.     ADD h%,winlib_y_off&(nr&)
  12872.     winlib_w%(nr&)=w%           ! merken!! ...
  12873.     winlib_h%(nr&)=h%
  12874.     '
  12875.     x&=@virt_to_word("X",x%)
  12876.     y&=@virt_to_word("Y",y%)
  12877.     w&=MIN(32767,w%)
  12878.     w&=@adjust_len(w&,winlib_cell_w&(nr&))
  12879.     h&=MIN(32767,h%)
  12880.     h&=@adjust_len(h&,winlib_cell_h&(nr&))
  12881.     '
  12882.     '
  12883.     ' errechne Arbeitsbereich-x/y:
  12884.     ~WIND_CALC(1,attr&,x&,y&,dummy&,dummy&,x&,y&,dummy&,dummy&)
  12885.     ' errechne Gesamt-Breite/Höhe:
  12886.     ~WIND_CALC(0,attr&,x&,y&,w&,h&,xx&,yy&,ww&,hh&)
  12887.     '
  12888.     FOR i&=1 TO 5             ! wg. WINX usw.
  12889.       IF ww&>winlib_dw&
  12890.         ww&=winlib_dw&
  12891.         ~WIND_CALC(1,attr&,xx&,yy&,ww&,hh&,x&,y&,w&,h&)
  12892.         w&=@adjust_len(w&,winlib_cell_w&(nr&))
  12893.         attr&=BSET(BSET(BSET(BSET(attr&,5),9),10),11) !Left,Right,Hslide,Size setzen
  12894.         ~WIND_CALC(0,attr&,x&,y&,w&,h&,xx&,yy&,ww&,hh&)
  12895.       ENDIF
  12896.       IF hh&>winlib_dh&
  12897.         hh&=winlib_dh&
  12898.         ~WIND_CALC(1,attr&,xx&,yy&,ww&,hh&,x&,y&,w&,h&)
  12899.         h&=@adjust_len(h&,winlib_cell_h&(nr&))
  12900.         attr&=BSET(BSET(BSET(BSET(attr&,5),6),7),8) !Up,Down,Vslide,Size setzen
  12901.         ~WIND_CALC(0,attr&,x&,y&,w&,h&,xx&,yy&,ww&,hh&)
  12902.       ENDIF
  12903.       IF x&+ww&>winlib_dw&
  12904.         ww&=winlib_dw&-x&
  12905.         ~WIND_CALC(1,attr&,xx&,yy&,ww&,hh&,x&,y&,w&,h&)
  12906.         w&=@adjust_len(w&,winlib_cell_w&(nr&))
  12907.         attr&=BSET(BSET(BSET(BSET(attr&,5),9),10),11) !Left,Right,Hslide,Size setzen
  12908.         ~WIND_CALC(0,attr&,x&,y&,w&,h&,xx&,yy&,ww&,hh&)
  12909.       ENDIF
  12910.       IF y&+hh&>winlib_dh&
  12911.         hh&=winlib_dh&-y&
  12912.         ~WIND_CALC(1,attr&,xx&,yy&,ww&,hh&,x&,y&,w&,h&)
  12913.         h&=@adjust_len(h&,winlib_cell_h&(nr&))
  12914.         attr&=BSET(BSET(BSET(BSET(attr&,5),6),7),8) !Up,Down,Vslide,Size setzen
  12915.         ~WIND_CALC(0,attr&,x&,y&,w&,h&,xx&,yy&,ww&,hh&)
  12916.       ENDIF
  12917.     NEXT i&
  12918.     '
  12919.     winlib_handles&(nr&)=WIND_CREATE(attr&,winlib_dx&,winlib_dy&,winlib_dw&,winlib_dh&)
  12920.     '
  12921.     IF winlib_handles&(nr&)>0
  12922.       IF BTST(attr&,0)  ! Name
  12923.         @set_wind_line(nr&,2,winlib_empty%)  ! sicher is sicher ...
  12924.       ENDIF
  12925.       IF BTST(attr&,4)  ! Info
  12926.         @set_wind_line(nr&,3,winlib_empty%)
  12927.       ENDIF
  12928.       winlib_attr&(nr&)=attr&
  12929.     ELSE
  12930.       winlib_handles&(nr&)=-1
  12931.       IF alert$<>"NO"
  12932.         IF alert$=""
  12933.           IF winlib_alert$<>""
  12934.             @winlib_alert(winlib_alert$)
  12935.           ENDIF
  12936.         ELSE
  12937.           @winlib_alert(alert$)
  12938.         ENDIF
  12939.       ENDIF
  12940.     ENDIF
  12941.   ENDIF
  12942. RETURN
  12943. > PROCEDURE delete_wind(nr&)
  12944.   ' löscht (und schließt nötigenfalls) Fenster nr
  12945.   ' mit nr<0 werden alle gelöscht (und nötigenfalls geschlossen)
  12946.   LOCAL i&
  12947.   '
  12948.   IF nr&<0
  12949.     IF DIM?(winlib_handles&())>0
  12950.       FOR i&=0 TO winlib_nr&
  12951.         @delete_one_wind(i&)
  12952.       NEXT i&
  12953.     ENDIF
  12954.   ELSE
  12955.     @delete_one_wind(nr&)
  12956.   ENDIF
  12957. RETURN
  12958. > PROCEDURE init_winlib(nr&,std_err_alert$)
  12959.   ' Das Winlib-Ziel: Fensterprogrammierung soweit möglich vereinfachen,
  12960.   ' vor allem: korrekte und effziente Abhandlung der AES-Fenstermeldungen,
  12961.   ' Reduzierung der Beschäftigung mit den unterschiedlichen Koordinaten aufs
  12962.   ' Minimum, (damit) erhebliche Vereinfachung des Redraw, feste Fensterkennungen
  12963.   '
  12964.   ' nr: Anzahl der vom Programm benötigten Fenster
  12965.   ' std_err_alert$: Standard-String für form_alert(), wenn kein Fenster mehr
  12966.   '                 verfügbar ist, zB
  12967.   ' "[3][Es kann kein Fenster mehr|geöffnet werden. Abhilfe:|schliessen Sie eines!][OK]"
  12968.   '        ***  Der String sollte nur einen Button enthalten!!  ***
  12969.   '
  12970.   ' exportiert: diverse Variablen/Felder mit der Kennung 'winlib_' als
  12971.   '             Präfix. Ergo sollte man im eigenen Programm Variablen
  12972.   '             mit dieser Kennung NICHT verwenden! Auch ein LESENDER
  12973.   '             Zugriff auf die Winlib-Variablen sollte unterbleiben:
  12974.   '             schlicht, weil er a) unnötig sein sollte und b) sich
  12975.   '             die Variablennamen der Winlib ändern können.
  12976.   '
  12977.   ' Speicherbedarf der Winlib:
  12978.   ' dynamisch (temporär): ca. 500 Bytes (maximal)
  12979.   ' statisch: a Words, b Long       : a=10, b=1
  12980.   '           g Word-Felder         : g=15
  12981.   '           h Long-Felder         : h=5
  12982.   '           i Boolean-Feld        : i=1
  12983.   '           2 Strings (std_err_alert,clippath)
  12984.   ' -> Bedarf=dynamisch + a*2 + b*4 + (g+h+i)*6 + (g*2*+h*4+i)*nr
  12985.   '     + Längen der Strings (+ Deskriptoren, pro String 6 Bytes)
  12986.   '     + 104 Bytes (Felder für BITBLT)
  12987.   '
  12988.   ' Werte des Desktop-Arbeitsbereichs holen:
  12989.   ~WIND_GET(0,4,winlib_dx&,winlib_dy&,winlib_dw&,winlib_dh&) !
  12990.   winlib_curtop&=0
  12991.   winlib_nr&=nr&
  12992.   winlib_xredr&=0
  12993.   winlib_yredr&=0
  12994.   winlib_wredr&=0
  12995.   winlib_hredr&=0
  12996. ' ## INLINE:
  12997. ' $0000: 00 00 
  12998. ' 2  Bytes.
  12999.   INLINE winlib_empty%,2
  13000.   WORD{winlib_empty%}=0
  13001.   '
  13002.   DIM winlib_handles&(nr&)
  13003.   DIM winlib_last_x&(nr&)
  13004.   DIM winlib_last_y&(nr&)
  13005.   DIM winlib_last_w&(nr&)
  13006.   DIM winlib_last_h&(nr&)
  13007.   DIM winlib_cell_w&(nr&)
  13008.   DIM winlib_cell_h&(nr&)
  13009.   DIM winlib_attr&(nr&)
  13010.   DIM winlib_min_w&(nr&)
  13011.   DIM winlib_min_h&(nr&)
  13012.   DIM winlib_x_off&(nr&)
  13013.   DIM winlib_y_off&(nr&)
  13014.   DIM winlib_curx&(nr&)
  13015.   DIM winlib_cury&(nr&)
  13016.   DIM winlib_rank&(nr&)
  13017.   '
  13018.   DIM winlib_w%(nr&)
  13019.   DIM winlib_h%(nr&)
  13020.   DIM winlib_hor_off%(nr&)
  13021.   DIM winlib_ver_off%(nr&)
  13022.   DIM winlib_flags%(nr&)
  13023.   '
  13024.   DIM winlib_on_screen!(nr&)
  13025.   '
  13026.   DIM winlib_smfdb%(5)
  13027.   DIM winlib_dmfdb%(5)
  13028.   DIM winlib_pxy%(8)
  13029.   winlib_alert$=std_err_alert$
  13030.   winlib_clippath$=""
  13031.   '
  13032.   ARRAYFILL winlib_last_x&(),-1
  13033.   ARRAYFILL winlib_rank&(),-1
  13034.   ARRAYFILL winlib_curx&(),0
  13035.   ARRAYFILL winlib_cury&(),0
  13036.   ARRAYFILL winlib_handles&(),-1 ! Negativer Wert, weil <0: Fehler bei create
  13037.   ARRAYFILL winlib_on_screen!(),FALSE
  13038. RETURN
  13039. > PROCEDURE ob_draw_wind(tree%,start&,depth&,x%,y%)
  13040.   IF x%>-32768
  13041.     IF y%>-32768
  13042.       OB_X(tree%,start&)=x%
  13043.       OB_Y(tree%,start&)=y%
  13044.       ~OBJC_DRAW(tree%,start&,depth&,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13045.     ENDIF
  13046.   ENDIF
  13047. RETURN
  13048. > PROCEDURE open_wind(nr&,mod|,x%,y%,w%,h%,hor%,ver%)
  13049.   LOCAL x&,y&,w&,h&,xx&,yy&,ww&,hh&,dummy&,help&,wmerk&,hmerk&
  13050.   ' nr: Fensternummer (programminterne Kennung)
  13051.   '
  13052.   ' mod: Modus; als da sind:
  13053.   '     1 : x,y,w,h sind Angaben in einem (virtuellen)
  13054.   '         1 Million * 1 Million - Koordinatensystem; Zweck:
  13055.   '         Fenster auflösungsunabhängig genau positionieren.
  13056.   '         Das Fenster wird im angegebenen Bereich zentriert (wenn 'nötig').
  13057.   '         Falls die verwendeten Koordinaten von der Funktion
  13058.   '         win_get_virt_coords() stammen, wird erkannt, ob das Fenster
  13059.   '         auf dem Bildschirm war, in diesem Fall wird es nicht geöffnet;
  13060.   '         dies wird vermerkt, und folgende Aufrufe in diesem Modus (zum
  13061.   '         Neupositionieren) werden ignoriert.
  13062.   '         Ein Fenster, das sich schon auf dem Bildschirm befindet, wird
  13063.   '         neu positioniert (aber nicht getoppt!).
  13064.   '     2 : wie 1, aber: das Fenster wird in _jedem_ Fall geöffnet
  13065.   '         und ev. getoppt; wenn das Fenster während des aktuellen
  13066.   '         Programmlaufs schonmal auf dem Bildschirm war und dann geschlossen
  13067.   '         wurde, werden x,y,w,h,hor,ver ignoriert und das Fenster an der
  13068.   '         letzten Position geöffnet
  13069.   '    alle anderen: reserviert
  13070.   '
  13071.   ' hor,ver: Horizontal-/Vertikal-Offset für den Fensterinhalt, bestimmen
  13072.   '          Sliderpositionierung
  13073.   '
  13074.   IF winlib_handles&(nr&)>0
  13075.     IF x%<0
  13076.       IF mod|=1
  13077.         winlib_last_x&(nr&)=-2
  13078.       ELSE IF mod|=2
  13079.         x%=(-x%)-1
  13080.       ENDIF
  13081.     ENDIF
  13082.     IF (mod|=1 AND winlib_last_x&(nr&)>-2) OR mod|=2
  13083.       IF mod|=1 OR (mod|=2 AND winlib_last_x&(nr&)<0)
  13084.         x&=@virt_to_word("X",x%)
  13085.         y&=@virt_to_word("Y",y%)
  13086.         w&=@virt_to_word("W",w%)
  13087.         h&=@virt_to_word("H",h%)
  13088.         winlib_hor_off%(nr&)=hor%
  13089.         winlib_ver_off%(nr&)=ver%
  13090.       ELSE
  13091.         x&=winlib_last_x&(nr&)
  13092.         y&=winlib_last_y&(nr&)
  13093.         w&=winlib_last_w&(nr&)
  13094.         h&=winlib_last_h&(nr&)
  13095.       ENDIF
  13096.       wmerk&=w&
  13097.       hmerk&=h&
  13098.       '
  13099.       ' errechne Arbeitsbereich:
  13100.       ~WIND_CALC(1,winlib_attr&(nr&),x&,y&,w&,h&,xx&,yy&,ww&,hh&)
  13101.       ' justieren:
  13102.       ww&=MIN(ww&,winlib_w%(nr&))
  13103.       hh&=MIN(hh&,winlib_h%(nr&))
  13104.       SUB ww&,winlib_x_off&(nr&)
  13105.       SUB hh&,winlib_y_off&(nr&)
  13106.       ww&=@adjust_len(ww&,winlib_cell_w&(nr&))
  13107.       hh&=@adjust_len(hh&,winlib_cell_h&(nr&))
  13108.       @adjust_hor_off(nr&,ww&)
  13109.       @adjust_ver_off(nr&,hh&)
  13110.       ' errechne Gesamtbereich:
  13111.       ~WIND_CALC(0,winlib_attr&(nr&),xx&,yy&,ww&+winlib_x_off&(nr&),hh&+winlib_y_off&(nr&),x&,y&,w&,h&)
  13112.       ' und zentrieren:
  13113.       ADD x&,DIV(wmerk&-w&,2)
  13114.       ADD y&,DIV(hmerk&-h&,2)
  13115.       '
  13116.       IF winlib_on_screen!(nr&)
  13117.         ~WIND_SET(winlib_handles&(nr&),5,x&,y&,w&,h&)
  13118.         @set_sliders(nr&)
  13119.         IF mod|=2
  13120.           ' IF NOT BTST(winlib_flags%(nr&),2)
  13121.           ~WIND_SET(winlib_handles&(nr&),10,0,0,0,0)
  13122.           @new_top(nr&)
  13123.           ' ENDIF
  13124.         ENDIF
  13125.       ELSE
  13126.         IF BTST(winlib_attr&(nr&),11) !Hslide
  13127.           help&=@slider_pos(ww&,SUB(winlib_w%(nr&),winlib_x_off&(nr&)),winlib_hor_off%(nr&))
  13128.           ~WIND_SET(winlib_handles&(nr&),8,help&,0,0,0)
  13129.           help&=@slider_len(ww&,SUB(winlib_w%(nr&),winlib_x_off&(nr&)))
  13130.           ~WIND_SET(winlib_handles&(nr&),15,help&,0,0,0)
  13131.         ENDIF
  13132.         IF BTST(winlib_attr&(nr&),8) !Vslide
  13133.           help&=@slider_pos(hh&,SUB(winlib_h%(nr&),winlib_y_off&(nr&)),winlib_ver_off%(nr&))
  13134.           ~WIND_SET(winlib_handles&(nr&),9,help&,0,0,0)
  13135.           help&=@slider_len(hh&,SUB(winlib_h%(nr&),winlib_y_off&(nr&)))
  13136.           ~WIND_SET(winlib_handles&(nr&),16,help&,0,0,0)
  13137.         ENDIF
  13138.         ~WIND_OPEN(winlib_handles&(nr&),x&,y&,w&,h&)
  13139.         @new_top(nr&)
  13140.         winlib_last_x&(nr&)=-1
  13141.         winlib_on_screen!(nr&)=TRUE
  13142.         @new_curpos(nr&)
  13143.       ENDIF
  13144.     ENDIF
  13145.   ENDIF
  13146. RETURN
  13147. > PROCEDURE redraw_programmer(nr&,which&,coordtype!,x%,y%,w%,h%)
  13148.   ' which: 0=Inhalt, 1=hor. Box, 2=vert. Box
  13149.   ' coordtype!: TRUE: x,y,w,h sind absolute Angaben
  13150.   '            FALSE: x,y,w,h sind wie xc,yc1,wc,yc2 bei fill_window()
  13151.   LOCAL xc%,yc1%,wc%,yc2%
  13152.   LOCAL x&,y&,w&,h&
  13153.   IF winlib_handles&(nr&)>0
  13154.     IF winlib_on_screen!(nr&)
  13155.       IF coordtype!
  13156.         IF which&=0
  13157.           SUB x%,winlib_hor_off%(nr&)
  13158.           SUB y%,winlib_ver_off%(nr&)
  13159.         ENDIF
  13160.         IF @size_to_word_range(x%,y%,w%,h%)
  13161.           ~WIND_GET(winlib_handles&(nr&),4,x&,y&,w&,h&)
  13162.           ADD x%,x&
  13163.           ADD y%,y&
  13164.           IF which&=0
  13165.             ADD x%,winlib_x_off&(nr&)
  13166.             ADD y%,winlib_y_off&(nr&)
  13167.           ENDIF
  13168.           IF x%<32768 AND y%<32768
  13169.             @redraw_wind(nr&,which&,TRUE,x%,y%,w%,h%)
  13170.           ENDIF
  13171.         ENDIF
  13172.       ELSE
  13173.         ~WIND_GET(winlib_handles&(nr&),4,x&,y&,w&,h&)
  13174.         IF which&=0
  13175.           xc%=DIV(winlib_hor_off%(nr&),winlib_cell_w&(nr&))
  13176.           yc1%=DIV(winlib_ver_off%(nr&),winlib_cell_h&(nr&))
  13177.           wc%=DIV(SUB(w&,winlib_x_off&(nr&)),winlib_cell_w&(nr&))
  13178.           yc2%=PRED(yc1%)+DIV(SUB(h&,winlib_y_off&(nr&)),winlib_cell_h&(nr&))
  13179.         ELSE IF which&=1
  13180.           ' xc%=0
  13181.           ' yc1%=0
  13182.           wc%=DIV(ADD(w&,PRED(winlib_cell_w&(nr&))),winlib_cell_w&(nr&))
  13183.           yc2%=PRED(DIV(ADD(winlib_y_off&(nr&),PRED(winlib_cell_w&(nr&))),winlib_cell_w&(nr&)))
  13184.         ELSE
  13185.           ' xc%=0
  13186.           ' yc1%=0
  13187.           wc%=DIV(ADD(winlib_x_off&(nr&),PRED(winlib_cell_w&(nr&))),winlib_cell_w&(nr&))
  13188.           yc2%=PRED(DIV(ADD(h&-winlib_y_off&(nr&),PRED(winlib_cell_w&(nr&))),winlib_cell_w&(nr&)))
  13189.         ENDIF
  13190.         ' @prompt(STR$(x%)+" "+STR$(y%)+" "+STR$(w%)+" "+STR$(h%))
  13191.         ' @prompt(STR$(xc%)+" "+STR$(yc1%)+" "+STR$(wc%)+" "+STR$(yc2%))
  13192.         IF x%<ADD(xc%,wc%)
  13193.           IF y%<SUCC(yc2%)
  13194.             xc%=MAX(x%,xc%)
  13195.             yc1%=MAX(y%,yc1%)
  13196.             yc2%=MIN(h%,yc2%)
  13197.             wc%=MIN(w%,wc%)
  13198.             ' @prompt(STR$(xc%)+" "+STR$(yc1%)+" "+STR$(wc%)+" "+STR$(yc2%))
  13199.             @redraw_wind(nr&,which&,FALSE,xc%,yc1%,wc%,yc2%)
  13200.             '  @redraw_wind(nr&,which&,FALSE,x%,y%,w%,h%)
  13201.           ENDIF
  13202.         ENDIF
  13203.       ENDIF
  13204.     ENDIF
  13205.   ENDIF
  13206. RETURN
  13207. > PROCEDURE redraw_part(nr&,which&)
  13208.   IF winlib_handles&(nr&)>0
  13209.     IF which&=0      ! Inhalt
  13210.       @redraw_wind(nr&,0,TRUE,0,0,winlib_dw&,winlib_dh&)
  13211.     ELSE IF which&=1 ! hor. Box
  13212.       @redraw_wind(nr&,1,TRUE,0,0,winlib_dw&,winlib_dh&)
  13213.     ELSE IF which&=2 ! ver. Box
  13214.       @redraw_wind(nr&,2,TRUE,0,0,winlib_dw&,winlib_dh&)
  13215.     ELSE IF which&=3 ! alle
  13216.       @redraw_wind(nr&,3,TRUE,0,0,winlib_dw&,winlib_dh&)
  13217.     ENDIF
  13218.   ENDIF
  13219. RETURN
  13220. > PROCEDURE set_wind_line(nr&,field&,adr%)
  13221.   IF winlib_handles&(nr&)>0
  13222.     IF (field&=2) OR (field&=3)  ! WF_NAME oder WF_INFO
  13223.       ~WIND_SET(winlib_handles&(nr&),field&,WORD(SWAP(adr%)),WORD(adr%),0,0)
  13224.     ENDIF
  13225.   ENDIF
  13226. RETURN
  13227. > PROCEDURE top_wind(nr&)
  13228.   IF winlib_handles&(nr&)>0
  13229.     IF winlib_on_screen!(nr&)
  13230.       ~WIND_SET(winlib_handles&(nr&),10,0,0,0,0)
  13231.       @new_top(nr&)
  13232.     ENDIF
  13233.   ENDIF
  13234. RETURN
  13235. ' #### folgende Procs/Funcs sind für den Programmierer absolut tabu
  13236. ' #### (und können sich jederzeit beliebig ändern):
  13237. > FUNCTION mywindow(gem_handle&,VAR nr&)
  13238.   LOCAL i&,ret!
  13239.   ret!=FALSE
  13240.   nr&=-1
  13241.   '
  13242.   FOR i&=0 TO winlib_nr&
  13243.     IF winlib_handles&(i&)>0 ! 0: Desktop, <0: Fehler bei create
  13244.       IF winlib_handles&(i&)=gem_handle&
  13245.         nr&=i&
  13246.         ret!=TRUE
  13247.         EXIT IF 1=1 ! it's not a sony ...
  13248.       ENDIF
  13249.     ENDIF
  13250.   NEXT i&
  13251.   '
  13252.   RETURN ret!
  13253. ENDFUNC
  13254. > FUNCTION arrow_wind(nr&,send!,msg$,no%)
  13255.   LOCAL dummy&,width&,height&
  13256.   '  IF winlib_handles&(nr&)>0
  13257.   ' IF winlib_on_screen!(nr&)
  13258.   ~WIND_GET(winlib_handles&(nr&),4,dummy&,dummy&,width&,height&)
  13259.   SUB width&,winlib_x_off&(nr&)+winlib_cell_w&(nr&)
  13260.   SUB height&,winlib_y_off&(nr&)+winlib_cell_h&(nr&)
  13261.   IF BTST(winlib_attr&(nr&),8) ! Vslide
  13262.     IF msg$="PG^"       ! Page Up
  13263.       RETURN @set_v_slider_position(nr&,send!,-(height&+no%*winlib_cell_h&(nr&)))
  13264.     ELSE IF msg$="PGv"  ! Page Down
  13265.       RETURN @set_v_slider_position(nr&,send!,height&+no%*winlib_cell_h&(nr&))
  13266.     ELSE IF msg$="v"  ! mit Zahlangabe
  13267.       RETURN @set_v_slider_position(nr&,send!,winlib_cell_h&(nr&)*no%)
  13268.     ELSE IF msg$="^"  ! mit Zahlangabe
  13269.       RETURN @set_v_slider_position(nr&,send!,-winlib_cell_h&(nr&)*no%)
  13270.     ENDIF
  13271.   ENDIF
  13272.   IF BTST(winlib_attr&(nr&),11) ! Hslide
  13273.     IF msg$="PG<"       ! 'Page-Left'
  13274.       RETURN @set_h_slider_position(nr&,send!,-(width&+no%*winlib_cell_w&(nr&)))
  13275.     ELSE IF msg$="PG>"  ! 'Page-Right'
  13276.       RETURN @set_h_slider_position(nr&,send!,width&+no%*winlib_cell_w&(nr&))
  13277.     ELSE IF msg$="<"  ! mit Zahlangabe
  13278.       RETURN @set_h_slider_position(nr&,send!,-winlib_cell_w&(nr&)*no%)
  13279.     ELSE IF msg$=">"  ! mit Zahlangabe
  13280.       RETURN @set_h_slider_position(nr&,send!,winlib_cell_w&(nr&)*no%)
  13281.     ENDIF
  13282.   ENDIF
  13283.   ' ENDIF
  13284.   ' ENDIF
  13285.   RETURN FALSE
  13286. ENDFUNC
  13287. > FUNCTION virt_to_word(w$,v%)
  13288.   v%=MAX(0,MIN(v%,1E+06))
  13289.   w$=UPPER$(w$)
  13290.   IF w$="X"
  13291.     RETURN ADD(winlib_dx&,ROUND((CFLOAT(v%)/1E+06)*winlib_dw&))
  13292.   ELSE IF w$="Y"
  13293.     RETURN ADD(winlib_dy&,ROUND((CFLOAT(v%)/1E+06)*winlib_dh&))
  13294.   ELSE IF w$="W"
  13295.     RETURN ROUND((CFLOAT(v%)/1E+06)*winlib_dw&)
  13296.   ELSE
  13297.     RETURN ROUND((CFLOAT(v%)/1E+06)*winlib_dh&)
  13298.   ENDIF
  13299. ENDFUNC
  13300. > FUNCTION size_in_word_range(x%,y%,w%,h%)
  13301.   IF x%>32767 OR y%>32767 OR w%>32767 OR h%>32767
  13302.     RETURN FALSE
  13303.   ENDIF
  13304.   IF x%<-32768 OR y%<-32768 OR w%<1 OR h%<1
  13305.     RETURN FALSE
  13306.   ENDIF
  13307.   RETURN TRUE
  13308. ENDFUNC
  13309. > FUNCTION size_to_word_range(VAR x%,y%,w%,h%)
  13310.   ' eigentlich size to visible word range
  13311.   IF x%>32767 OR y%>32767 OR w%<1 OR h%<1
  13312.     RETURN FALSE
  13313.   ENDIF
  13314.   IF x%<0
  13315.     ADD w%,x%
  13316.     IF w%<1
  13317.       RETURN FALSE
  13318.     ENDIF
  13319.     x%=0
  13320.   ENDIF
  13321.   IF y%<0
  13322.     ADD h%,y%
  13323.     IF h%<1
  13324.       RETURN FALSE
  13325.     ENDIF
  13326.     y%=0
  13327.   ENDIF
  13328.   w%=MIN(32767,w%)
  13329.   h%=MIN(32767,h%)
  13330.   RETURN TRUE
  13331. ENDFUNC
  13332. > PROCEDURE new_top(nr&)
  13333.   LOCAL i&
  13334.   FOR i&=0 TO winlib_nr&
  13335.     EXIT IF winlib_rank&(i&)=nr&
  13336.   NEXT i&
  13337.   IF i&>winlib_nr&
  13338.     i&=0
  13339.   ENDIF
  13340.   DELETE winlib_rank&(i&)
  13341.   winlib_rank&(winlib_nr&)=nr&
  13342.   winlib_curtop&=nr&
  13343. RETURN
  13344. > PROCEDURE delete_one_wind(nr&)
  13345.   IF winlib_handles&(nr&)>0  ! nötig
  13346.     IF winlib_on_screen!(nr&) ! nötig
  13347.       ' schnell noch Außenmaße merken:
  13348.       ~WIND_GET(winlib_handles&(nr&),5,winlib_last_x&(nr&),winlib_last_y&(nr&),winlib_last_w&(nr&),winlib_last_h&(nr&))
  13349.       ~WIND_CLOSE(winlib_handles&(nr&))
  13350.       winlib_on_screen!(nr&)=FALSE
  13351.     ENDIF
  13352.     ~WIND_DELETE(winlib_handles&(nr&))
  13353.     winlib_handles&(nr&)=-1
  13354.   ENDIF
  13355. RETURN
  13356. > PROCEDURE clipbrd_check
  13357.   ~SCRP_READ(winlib_clippath$)
  13358.   IF LEN(winlib_clippath$)>0
  13359.     IF RIGHT$(winlib_clippath$)<>"\"
  13360.       winlib_clippath$=winlib_clippath$+"\"
  13361.     ENDIF
  13362.     @clipbrd_search
  13363.   ENDIF
  13364. RETURN
  13365. > PROCEDURE set_sliders(nr&)
  13366.   @set_v_slider(nr&)
  13367.   @set_h_slider(nr&)
  13368. RETURN
  13369. > PROCEDURE set_v_slider(nr&)
  13370.   IF BTST(winlib_attr&(nr&),8) ! Vslide
  13371.     @set_v_slider_length(nr&)
  13372.     ~@set_v_slider_position(nr&,TRUE,0)
  13373.   ENDIF
  13374. RETURN
  13375. > PROCEDURE set_h_slider(nr&)
  13376.   IF BTST(winlib_attr&(nr&),11) ! Hslide
  13377.     @set_h_slider_length(nr&)
  13378.     ~@set_h_slider_position(nr&,TRUE,0)
  13379.   ENDIF
  13380. RETURN
  13381. > PROCEDURE set_v_slider_length(nr&)
  13382.   LOCAL h&,help&,dummy&,l&
  13383.   ~WIND_GET(winlib_handles&(nr&),4,dummy&,dummy&,dummy&,h&)
  13384.   ~WIND_GET(winlib_handles&(nr&),16,l&,dummy&,dummy&,dummy&)
  13385.   help&=@slider_len(SUB(h&,winlib_y_off&(nr&)),SUB(winlib_h%(nr&),winlib_y_off&(nr&)))
  13386.   IF help&<>l&
  13387.     ~WIND_SET(winlib_handles&(nr&),16,help&,dummy&,dummy&,dummy&)
  13388.   ENDIF
  13389. RETURN
  13390. > PROCEDURE set_h_slider_length(nr&)
  13391.   LOCAL w&,help&,dummy&,l&
  13392.   ~WIND_GET(winlib_handles&(nr&),4,dummy&,dummy&,w&,dummy&)
  13393.   ~WIND_GET(winlib_handles&(nr&),15,l&,dummy&,dummy&,dummy&)
  13394.   help&=@slider_len(SUB(w&,winlib_x_off&(nr&)),SUB(winlib_w%(nr&),winlib_x_off&(nr&)))
  13395.   IF help&<>l&
  13396.     ~WIND_SET(winlib_handles&(nr&),15,help&,dummy&,dummy&,dummy&)
  13397.   ENDIF
  13398. RETURN
  13399. > FUNCTION set_h_slider_position(nr&,send!,amount&)
  13400.   LOCAL x&,y&,w&,h&,help&,dummy&,p&,hor_off_old%,diff&,f1|,f2|,back!
  13401.   back!=FALSE
  13402.   ~WIND_GET(winlib_handles&(nr&),4,x&,y&,w&,h&)
  13403.   CLIP x&,y&,w&,h&
  13404.   SUB w&,winlib_x_off&(nr&)
  13405.   ~WIND_GET(winlib_handles&(nr&),8,p&,dummy&,dummy&,dummy&)
  13406.   hor_off_old%=winlib_hor_off%(nr&)
  13407.   '
  13408.   ADD winlib_hor_off%(nr&),amount&
  13409.   @adjust_hor_off(nr&,w&)
  13410.   '
  13411.   help&=@slider_pos(w&,SUB(winlib_w%(nr&),winlib_x_off&(nr&)),winlib_hor_off%(nr&))
  13412.   '
  13413.   IF help&<>p&
  13414.     ~WIND_SET(winlib_handles&(nr&),8,help&,dummy&,dummy&,dummy&)
  13415.   ENDIF
  13416.   IF winlib_hor_off%(nr&)<>hor_off_old%
  13417.     diff&=winlib_hor_off%(nr&)-hor_off_old%
  13418.     IF diff&>0
  13419.       f1|=1
  13420.       f2|=0
  13421.     ELSE
  13422.       f1|=0
  13423.       f2|=1
  13424.       diff&=MUL(-1,diff&)
  13425.     ENDIF
  13426.     IF @win_topabs(nr&) AND diff&=winlib_cell_w&(nr&) AND BTST(winlib_flags%(nr&),0)
  13427.       ADD x&,winlib_x_off&(nr&)
  13428.       ADD y&,winlib_y_off&(nr&)
  13429.       SUB h&,winlib_y_off&(nr&)
  13430.       SUB w&,diff&
  13431.       ~WIND_UPDATE(1)
  13432.       ~GRAF_MOUSE(256,0)
  13433.       @cursor_draw(nr&,x&-winlib_x_off&(nr&),y&-winlib_y_off&(nr&))
  13434.       @vcopy(x&+MUL(diff&,f1|),y&,w&,h&,x&+MUL(diff&,f2|),y&,w&,h&)
  13435.       @cursor_draw(nr&,x&-winlib_x_off&(nr&),y&-winlib_y_off&(nr&))
  13436.       ~GRAF_MOUSE(257,0)
  13437.       ~WIND_UPDATE(0)
  13438.       @redraw_wind(nr&,0,TRUE,x&+MUL(w&,f1|),y&,diff&,h&)
  13439.     ELSE
  13440.       @redraw_part(nr&,0)
  13441.     ENDIF
  13442.     back!=TRUE
  13443.   ENDIF
  13444.   IF send! AND back!
  13445.     @new_curpos(nr&)
  13446.   ENDIF
  13447.   RETURN back!
  13448. ENDFUNC
  13449. > FUNCTION set_v_slider_position(nr&,send!,amount&)
  13450.   LOCAL x&,y&,w&,h&,help&,dummy&,p&,ver_off_old%,diff&,f1|,f2|,back!
  13451.   back!=FALSE
  13452.   ~WIND_GET(winlib_handles&(nr&),4,x&,y&,w&,h&)
  13453.   SUB h&,winlib_y_off&(nr&)
  13454.   ~WIND_GET(winlib_handles&(nr&),9,p&,dummy&,dummy&,dummy&)
  13455.   ver_off_old%=winlib_ver_off%(nr&)
  13456.   '
  13457.   ADD winlib_ver_off%(nr&),amount&
  13458.   @adjust_ver_off(nr&,h&)
  13459.   '
  13460.   help&=@slider_pos(h&,SUB(winlib_h%(nr&),winlib_y_off&(nr&)),winlib_ver_off%(nr&))
  13461.   '
  13462.   IF help&<>p&
  13463.     ~WIND_SET(winlib_handles&(nr&),9,help&,dummy&,dummy&,dummy&)
  13464.   ENDIF
  13465.   IF winlib_ver_off%(nr&)<>ver_off_old%
  13466.     diff&=winlib_ver_off%(nr&)-ver_off_old%
  13467.     IF diff&>0
  13468.       f1|=1
  13469.       f2|=0
  13470.     ELSE
  13471.       f1|=0
  13472.       f2|=1
  13473.       diff&=MUL(-1,diff&)
  13474.     ENDIF
  13475.     IF @win_topabs(nr&) AND diff&=winlib_cell_h&(nr&) AND BTST(winlib_flags%(nr&),0)
  13476.       ADD x&,winlib_x_off&(nr&)
  13477.       ADD y&,winlib_y_off&(nr&)
  13478.       SUB w&,winlib_x_off&(nr&)
  13479.       CLIP x&,y&,w&,h&
  13480.       SUB h&,diff&
  13481.       ~WIND_UPDATE(1)
  13482.       ~GRAF_MOUSE(256,0)
  13483.       @cursor_draw(nr&,x&-winlib_x_off&(nr&),y&-winlib_y_off&(nr&))
  13484.       @vcopy(x&,y&+MUL(diff&,f1|),w&,h&,x&,y&+MUL(diff&,f2|),w&,h&)
  13485.       @cursor_draw(nr&,x&-winlib_x_off&(nr&),y&-winlib_y_off&(nr&))
  13486.       ~GRAF_MOUSE(257,0)
  13487.       ~WIND_UPDATE(0)
  13488.       @redraw_wind(nr&,0,TRUE,x&,y&+MUL(h&,f1|),w&,diff&)
  13489.     ELSE
  13490.       @redraw_part(nr&,0)
  13491.     ENDIF
  13492.     back!=TRUE
  13493.   ENDIF
  13494.   IF send! AND back!
  13495.     @new_curpos(nr&)
  13496.   ENDIF
  13497.   RETURN back!
  13498. ENDFUNC
  13499. > PROCEDURE vcopy(x&,y&,w&,h&,x1&,y1&,w1&,h1&)
  13500.   winlib_smfdb%(0)=0
  13501.   winlib_dmfdb%(0)=0
  13502.   winlib_pxy%(0)=x&
  13503.   winlib_pxy%(1)=y&
  13504.   winlib_pxy%(2)=x&+w&-1
  13505.   winlib_pxy%(3)=y&+h&-1
  13506.   winlib_pxy%(4)=x1&
  13507.   winlib_pxy%(5)=y1&
  13508.   winlib_pxy%(6)=x1&+w1&-1
  13509.   winlib_pxy%(7)=y1&+h1&-1
  13510.   winlib_pxy%(8)=3
  13511.   BITBLT winlib_smfdb%(),winlib_dmfdb%(),winlib_pxy%()
  13512. RETURN
  13513. > PROCEDURE adjust_hor_off(nr&,w&)
  13514.   LOCAL help%
  13515.   help%=MIN(MAX(0,winlib_hor_off%(nr&)),winlib_w%(nr&)-winlib_x_off&(nr&)-w&)
  13516.   winlib_hor_off%(nr&)=MUL(DIV(help%,winlib_cell_w&(nr&)),winlib_cell_w&(nr&))
  13517.   IF SUB(help%,winlib_hor_off%(nr&))>=(winlib_cell_w&(nr&)/2)
  13518.     ADD winlib_hor_off%(nr&),winlib_cell_w&(nr&)
  13519.   ENDIF
  13520. RETURN
  13521. > PROCEDURE adjust_ver_off(nr&,h&)
  13522.   LOCAL help%
  13523.   help%=MIN(MAX(0,winlib_ver_off%(nr&)),winlib_h%(nr&)-winlib_y_off&(nr&)-h&)
  13524.   winlib_ver_off%(nr&)=MUL(DIV(help%,winlib_cell_h&(nr&)),winlib_cell_h&(nr&))
  13525.   IF SUB(help%,winlib_ver_off%(nr&))>=(winlib_cell_h&(nr&)/2)
  13526.     ADD winlib_ver_off%(nr&),winlib_cell_h&(nr&)
  13527.   ENDIF
  13528. RETURN
  13529. DEFFN adjust_len(len&,clen&)=MUL(DIV(len&,clen&),clen&)
  13530. > FUNCTION slider_len(window_work_length&,contents_length%)
  13531.   RETURN WORD(CFLOAT(window_work_length&)/(CFLOAT(contents_length%)/1000))
  13532. ENDFUNC
  13533. > FUNCTION slider_pos(window_work_length&,contents_length%,off%)
  13534.   RETURN MAX(0,MIN(1000,off%*(1001/(MAX(0.1,contents_length%-window_work_length&)))))
  13535. ENDFUNC
  13536. > PROCEDURE cursor_draw(nr&,xc&,yc&)
  13537.   LOCAL wc&,hc&
  13538.   IF BTST(winlib_flags%(nr&),1)
  13539.     wc&=winlib_cell_w&(nr&)
  13540.     hc&=winlib_cell_h&(nr&)
  13541.     ADD xc&,winlib_x_off&(nr&)
  13542.     ADD yc&,winlib_y_off&(nr&)
  13543.     ADD xc&,winlib_curx&(nr&)*wc&
  13544.     ADD yc&,winlib_cury&(nr&)*hc&
  13545.     DEFFILL 1,1
  13546.     BOUNDARY 0
  13547.     GRAPHMODE 3
  13548.     PBOX xc&-1,yc&-1,xc&+wc&,yc&+hc&
  13549.   ENDIF
  13550. RETURN
  13551. > PROCEDURE redraw_wind(nr&,which&,type!,x%,y%,w%,h%)
  13552.   LOCAL xbase&,ybase&,width&,height&,dummy&
  13553.   LOCAL xmerk&,ymerk&,wmerk&,hmerk&
  13554.   LOCAL xc%,yc1%,wc%,yc2%
  13555.   LOCAL xoff%,yoff%,xc&,yc&
  13556.   '
  13557.   xc&=WORD(x%)
  13558.   yc&=WORD(y%)
  13559.   '
  13560.   ~WIND_UPDATE(1)
  13561.   ~GRAF_MOUSE(256,0)
  13562.   '
  13563.   ~WIND_GET(winlib_handles&(nr&),4,xbase&,ybase&,width&,height&)
  13564.   ~WIND_GET(winlib_handles&(nr&),11,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13565.   WHILE winlib_wredr&>0 AND winlib_hredr&>0
  13566.     IF RC_INTERSECT(winlib_dx&,winlib_dy&,winlib_dw&,winlib_dh&,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13567.       IF RC_INTERSECT(xbase&,ybase&,width&,height&,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13568.         '
  13569.         IF type!
  13570.           IF RC_INTERSECT(x%,y%,w%,h%,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13571.             xmerk&=winlib_xredr&
  13572.             ymerk&=winlib_yredr&
  13573.             wmerk&=winlib_wredr&
  13574.             hmerk&=winlib_hredr&
  13575.             IF which&=0 OR which&=3   ! eigentlicher Fensterinhalt
  13576.               IF RC_INTERSECT(ADD(xbase&,winlib_x_off&(nr&)),ADD(ybase&,winlib_y_off&(nr&)),width&,height&,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13577.                 CLIP winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr& ! offset 0,0
  13578.                 xoff%=SUB(ADD(xbase&,winlib_x_off&(nr&)),winlib_hor_off%(nr&))
  13579.                 yoff%=SUB(ADD(ybase&,winlib_y_off&(nr&)),winlib_ver_off%(nr&))
  13580.                 '
  13581.                 xc%=DIV(winlib_hor_off%(nr&),winlib_cell_w&(nr&))
  13582.                 wc%=xc%
  13583.                 ADD xc%,DIV(SUB(SUB(winlib_xredr&,xbase&),winlib_x_off&(nr&)),winlib_cell_w&(nr&))
  13584.                 ADD wc%,DIV(SUB(SUB(ADD(PRED(winlib_wredr&),winlib_xredr&),xbase&),winlib_x_off&(nr&)),winlib_cell_w&(nr&))
  13585.                 SUB wc%,PRED(xc%)
  13586.                 '
  13587.                 yc1%=DIV(winlib_ver_off%(nr&),winlib_cell_h&(nr&))
  13588.                 yc2%=yc1%
  13589.                 ADD yc1%,DIV(SUB(SUB(winlib_yredr&,ybase&),winlib_y_off&(nr&)),winlib_cell_h&(nr&))
  13590.                 ADD yc2%,DIV(SUB(SUB(ADD(PRED(winlib_hredr&),winlib_yredr&),ybase&),winlib_y_off&(nr&)),winlib_cell_h&(nr&))
  13591.                 '
  13592.                 @cursor_draw(nr&,xbase&,ybase&)
  13593.                 @fill_window(nr&,0,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&,xc%,yc1%,wc%,yc2%,xoff%,yoff%)
  13594.                 @cursor_draw(nr&,xbase&,ybase&)
  13595.               ENDIF
  13596.             ENDIF
  13597.             IF which&=1 OR which&=3   ! horizontale Box
  13598.               winlib_xredr&=xmerk&
  13599.               winlib_yredr&=ymerk&
  13600.               winlib_wredr&=wmerk&
  13601.               winlib_hredr&=hmerk&
  13602.               IF RC_INTERSECT(xbase&,ybase&,width&,winlib_y_off&(nr&),winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13603.                 CLIP winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr& ! offset 0,0
  13604.                 xoff%=xbase&
  13605.                 yoff%=ybase&
  13606.                 '
  13607.                 xc%=DIV(SUB(winlib_xredr&,xbase&),winlib_cell_w&(nr&))
  13608.                 wc%=DIV(SUB(ADD(PRED(winlib_wredr&),winlib_xredr&),xbase&),winlib_cell_w&(nr&))
  13609.                 SUB wc%,PRED(xc%)
  13610.                 '
  13611.                 yc1%=DIV(SUB(winlib_yredr&,ybase&),winlib_cell_h&(nr&))
  13612.                 yc2%=DIV(SUB(ADD(PRED(winlib_hredr&),winlib_yredr&),ybase&),winlib_cell_h&(nr&))
  13613.                 '
  13614.                 @fill_window(nr&,1,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&,xc%,yc1%,wc%,yc2%,xoff%,yoff%)
  13615.               ENDIF
  13616.             ENDIF
  13617.             IF which&=2 OR which&=3  ! vertikale Box
  13618.               winlib_xredr&=xmerk&
  13619.               winlib_yredr&=ymerk&
  13620.               winlib_wredr&=wmerk&
  13621.               winlib_hredr&=hmerk&
  13622.               IF RC_INTERSECT(xbase&,ybase&,winlib_x_off&(nr&),height&,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13623.                 CLIP winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr& ! offset 0,0
  13624.                 xoff%=xbase&
  13625.                 yoff%=ybase&
  13626.                 '
  13627.                 xc%=DIV(SUB(winlib_xredr&,xbase&),winlib_cell_w&(nr&))
  13628.                 wc%=DIV(SUB(ADD(PRED(winlib_wredr&),winlib_xredr&),xbase&),winlib_cell_w&(nr&))
  13629.                 SUB wc%,PRED(xc%)
  13630.                 '
  13631.                 yc1%=DIV(SUB(winlib_yredr&,ybase&),winlib_cell_h&(nr&))
  13632.                 yc2%=DIV(SUB(ADD(PRED(winlib_hredr&),winlib_yredr&),ybase&),winlib_cell_h&(nr&))
  13633.                 '
  13634.                 @fill_window(nr&,2,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&,xc%,yc1%,wc%,yc2%,xoff%,yoff%)
  13635.               ENDIF
  13636.             ENDIF
  13637.           ENDIF
  13638.         ELSE ! type!
  13639.           xmerk&=winlib_xredr&
  13640.           ymerk&=winlib_yredr&
  13641.           wmerk&=winlib_wredr&
  13642.           hmerk&=winlib_hredr&
  13643.           IF which&=4
  13644.             IF RC_INTERSECT(ADD(xbase&,winlib_x_off&(nr&)),ADD(ybase&,winlib_y_off&(nr&)),width&,height&,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13645.               CLIP winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr& ! offset 0,0
  13646.               @cursor_draw(nr&,xbase&,ybase&)
  13647.               SWAP winlib_curx&(nr&),xc&
  13648.               SWAP winlib_cury&(nr&),yc&
  13649.               @cursor_draw(nr&,xbase&,ybase&)
  13650.               SWAP winlib_curx&(nr&),xc&
  13651.               SWAP winlib_cury&(nr&),yc&
  13652.             ENDIF
  13653.           ELSE
  13654.             IF which&=0 OR which&=3   ! eigentlicher Fensterinhalt
  13655.               IF RC_INTERSECT(ADD(xbase&,winlib_x_off&(nr&)),ADD(ybase&,winlib_y_off&(nr&)),width&,height&,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13656.                 CLIP winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr& ! offset 0,0
  13657.                 xoff%=SUB(ADD(xbase&,winlib_x_off&(nr&)),winlib_hor_off%(nr&))
  13658.                 yoff%=SUB(ADD(ybase&,winlib_y_off&(nr&)),winlib_ver_off%(nr&))
  13659.                 '
  13660.                 @cursor_draw(nr&,xbase&,ybase&)
  13661.                 @fill_window(nr&,0,0,0,0,0,x%,y%,w%,h%,xoff%,yoff%)
  13662.                 @cursor_draw(nr&,xbase&,ybase&)
  13663.               ENDIF
  13664.             ENDIF
  13665.             IF which&=1 OR which&=3   ! horizontale Box
  13666.               winlib_xredr&=xmerk&
  13667.               winlib_yredr&=ymerk&
  13668.               winlib_wredr&=wmerk&
  13669.               winlib_hredr&=hmerk&
  13670.               IF RC_INTERSECT(xbase&,ybase&,width&,winlib_y_off&(nr&),winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13671.                 CLIP winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr& ! offset 0,0
  13672.                 xoff%=xbase&
  13673.                 yoff%=ybase&
  13674.                 @fill_window(nr&,1,0,0,0,0,x%,y%,w%,h%,xoff%,yoff%)
  13675.               ENDIF
  13676.             ENDIF
  13677.             IF which&=2 OR which&=3  ! vertikale Box
  13678.               winlib_xredr&=xmerk&
  13679.               winlib_yredr&=ymerk&
  13680.               winlib_wredr&=wmerk&
  13681.               winlib_hredr&=hmerk&
  13682.               IF RC_INTERSECT(xbase&,ybase&,winlib_x_off&(nr&),height&,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13683.                 CLIP winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr& ! offset 0,0
  13684.                 xoff%=xbase&
  13685.                 yoff%=ybase&
  13686.                 @fill_window(nr&,2,0,0,0,0,x%,y%,w%,h%,xoff%,yoff%)
  13687.               ENDIF
  13688.             ENDIF
  13689.           ENDIF
  13690.         ENDIF
  13691.         '
  13692.       ENDIF
  13693.     ENDIF
  13694.     ~WIND_GET(winlib_handles&(nr&),12,winlib_xredr&,winlib_yredr&,winlib_wredr&,winlib_hredr&)
  13695.   WEND
  13696.   IF which&=4
  13697.     SWAP winlib_curx&(nr&),xc&
  13698.     SWAP winlib_cury&(nr&),yc&
  13699.   ENDIF
  13700.   '
  13701.   ~GRAF_MOUSE(257,0)
  13702.   ~WIND_UPDATE(0)
  13703. RETURN
  13704. > PROCEDURE button_wind(k&,no&,x&,y&)
  13705.   LOCAL xbase&,ybase&,width&,height&
  13706.   LOCAL xredr&,yredr&,wredr&,hredr&
  13707.   LOCAL nr&,xoff%,yoff%,xc1%,yc1%
  13708.   ~GRAF_MKSTATE(xbase&,ybase&,width&,height&)
  13709.   IF width&=0     ! Maustaste wieder losgelassen
  13710.     IF k&>0
  13711.       IF @win_find(x&,y&,nr&)
  13712.         ~WIND_GET(winlib_handles&(nr&),4,xbase&,ybase&,width&,height&)
  13713.         xredr&=x&
  13714.         yredr&=y&
  13715.         wredr&=1
  13716.         hredr&=1
  13717.         ' 10
  13718.         IF RC_INTERSECT(ADD(xbase&,winlib_x_off&(nr&)),ADD(ybase&,winlib_y_off&(nr&)),width&-winlib_x_off&(nr&),height&-winlib_y_off&(nr&),xredr&,yredr&,wredr&,hredr&)
  13719.           xoff%=SUB(ADD(xbase&,winlib_x_off&(nr&)),winlib_hor_off%(nr&))
  13720.           yoff%=SUB(ADD(ybase&,winlib_y_off&(nr&)),winlib_ver_off%(nr&))
  13721.           xc1%=DIV(winlib_hor_off%(nr&),winlib_cell_w&(nr&))
  13722.           ADD xc1%,DIV(SUB(SUB(xredr&,xbase&),winlib_x_off&(nr&)),winlib_cell_w&(nr&))
  13723.           yc1%=DIV(winlib_ver_off%(nr&),winlib_cell_h&(nr&))
  13724.           ADD yc1%,DIV(SUB(SUB(yredr&,ybase&),winlib_y_off&(nr&)),winlib_cell_h&(nr&))
  13725.           @fill_window(nr&,10,x&,y&,k&,no&,xc1%,yc1%,1,yc1%,xoff%,yoff%)
  13726.           GOTO end_button_wind
  13727.         ENDIF
  13728.         ' 11
  13729.         xredr&=x&
  13730.         yredr&=y&
  13731.         wredr&=1
  13732.         hredr&=1
  13733.         IF RC_INTERSECT(xbase&,ybase&,width&,winlib_y_off&(nr&),xredr&,yredr&,wredr&,hredr&)
  13734.           xoff%=xbase&
  13735.           yoff%=ybase&
  13736.           xc1%=DIV(SUB(xredr&,xbase&),winlib_cell_w&(nr&))
  13737.           yc1%=DIV(SUB(yredr&,ybase&),winlib_cell_h&(nr&))
  13738.           @fill_window(nr&,11,x&,y&,k&,no&,xc1%,yc1%,1,yc1%,xoff%,yoff%)
  13739.           GOTO end_button_wind
  13740.         ENDIF
  13741.         ' 12
  13742.         xredr&=x&
  13743.         yredr&=y&
  13744.         wredr&=1
  13745.         hredr&=1
  13746.         IF RC_INTERSECT(xbase&,ybase&,winlib_x_off&(nr&),height&,xredr&,yredr&,wredr&,hredr&)
  13747.           xoff%=xbase&
  13748.           yoff%=ybase&
  13749.           xc1%=DIV(SUB(xredr&,xbase&),winlib_cell_w&(nr&))
  13750.           yc1%=DIV(SUB(yredr&,ybase&),winlib_cell_h&(nr&))
  13751.           @fill_window(nr&,12,x&,y&,k&,no&,xc1%,yc1%,1,yc1%,xoff%,yoff%)
  13752.           GOTO end_button_wind
  13753.         ENDIF
  13754.       ENDIF
  13755.     ENDIF
  13756.   ENDIF
  13757. end_button_wind:
  13758. RETURN
  13759. > PROCEDURE window_event   ! Name garantiert, Aufruf nur über ON MENU MESSAGE
  13760.   LOCAL nr&,x&,y&,w&,h&,help&,help1&,dummy&,help%,hmerk&,wmerk&
  13761.   IF @mywindow(MENU(4),nr&)
  13762.     SELECT MENU(1)
  13763.     CASE 20        ! WM_REDRAW
  13764.       @redraw_wind(nr&,3,TRUE,MENU(5),MENU(6),MENU(7),MENU(8))
  13765.       IF winlib_curtop&=nr&
  13766.         @clipbrd_check
  13767.       ENDIF
  13768.     CASE 21,29     ! WM_TOPPED, WM_NEWTOP
  13769.       IF BTST(winlib_flags%(nr&),2)
  13770.         ~GRAF_MKSTATE(x&,y&,w&,h&)
  13771.         @button_wind(MAX(w&,1),1,x&,y&)
  13772.       ELSE
  13773.         @clipbrd_check
  13774.         @new_top(nr&)
  13775.         ~WIND_SET(winlib_handles&(nr&),10,0,0,0,0)
  13776.       ENDIF
  13777.     CASE 22        ! WM_CLOSED
  13778.       IF @rsc_alert(1,"Programm 'Geld_her!' beenden ?","[Ende|[Abbruch",2)
  13779.         @global_exit
  13780.       ENDIF
  13781.       '        @close_window(nr&)  ! Wäre normal seriöser
  13782.     CASE 23        ! WM_FULLED
  13783.       IF winlib_last_x&(nr&)=-1
  13784.         ' Full
  13785.         ~WIND_GET(winlib_handles&(nr&),5,winlib_last_x&(nr&),winlib_last_y&(nr&),winlib_last_w&(nr&),winlib_last_h&(nr&))
  13786.         @open_wind(nr&,1,0,0,1000000,1000000,winlib_hor_off%(nr&),winlib_ver_off%(nr&))
  13787.       ELSE
  13788.         ' Alte Größe
  13789.         ~WIND_SET(winlib_handles&(nr&),5,winlib_last_x&(nr&),winlib_last_y&(nr&),winlib_last_w&(nr&),winlib_last_h&(nr&))
  13790.         @set_sliders(nr&)
  13791.         winlib_last_x&(nr&)=-1
  13792.       ENDIF
  13793.     CASE 27        ! WM_SIZED
  13794.       ~WIND_CALC(1,winlib_attr&(nr&),MENU(5),MENU(6),MENU(7),MENU(8),x&,y&,w&,h&)
  13795.       w&=MIN(w&,winlib_w%(nr&))
  13796.       SUB w&,winlib_x_off&(nr&)
  13797.       w&=MAX(w&,winlib_min_w&(nr&))
  13798.       w&=@adjust_len(w&,winlib_cell_w&(nr&))
  13799.       wmerk&=w&
  13800.       ADD w&,winlib_x_off&(nr&)
  13801.       '
  13802.       h&=MIN(h&,winlib_h%(nr&))
  13803.       SUB h&,winlib_y_off&(nr&)
  13804.       h&=MAX(h&,winlib_min_h&(nr&))
  13805.       h&=@adjust_len(h&,winlib_cell_h&(nr&))
  13806.       hmerk&=h&
  13807.       ADD h&,winlib_y_off&(nr&)
  13808.       '
  13809.       ~WIND_CALC(0,winlib_attr&(nr&),x&,y&,w&,h&,x&,y&,w&,h&)
  13810.       ~WIND_GET(winlib_handles&(nr&),5,dummy&,dummy&,help&,help1&)
  13811.       IF w&<>help& OR h&<>help1&
  13812.         winlib_last_x&(nr&)=-1
  13813.         IF h&<help1&
  13814.           dummy&=DIV(hmerk&,winlib_cell_h&(nr&))
  13815.           IF dummy&<winlib_cury&(nr&)
  13816.             @redraw_wind(nr&,4,FALSE,winlib_curx&(nr&),dummy&,0,0)
  13817.           ENDIF
  13818.         ENDIF
  13819.         IF w&<help&
  13820.           dummy&=DIV(wmerk&,winlib_cell_w&(nr&))
  13821.           IF dummy&<winlib_curx&(nr&)
  13822.             @redraw_wind(nr&,4,FALSE,dummy&,winlib_cury&(nr&),0,0)
  13823.           ENDIF
  13824.         ENDIF
  13825.         ~WIND_SET(winlib_handles&(nr&),5,x&,y&,w&,h&)
  13826.         @set_sliders(nr&)
  13827.       ENDIF
  13828.     CASE 28        ! WM_MOVED
  13829.       ~WIND_GET(winlib_handles&(nr&),5,x&,y&,dummy&,dummy&)
  13830.       IF x&<>MENU(5) OR y&<>MENU(6)
  13831.         winlib_last_x&(nr&)=-1
  13832.         ~WIND_SET(winlib_handles&(nr&),5,MENU(5),MENU(6),MENU(7),MENU(8))
  13833.       ENDIF
  13834.     CASE 24        ! WM_ARROWED
  13835.       SELECT MENU(5)
  13836.       CASE 0       ! oberhalb V-Regler
  13837.         ~@arrow_wind(nr&,TRUE,"PG^",0)
  13838.       CASE 1       ! unterhalb V-Regler
  13839.         ~@arrow_wind(nr&,TRUE,"PGv",0)
  13840.       CASE 2       ! Pfeil oben
  13841.         ~@arrow_wind(nr&,TRUE,"^",1)
  13842.       CASE 3       ! Pfeil unten
  13843.         ~@arrow_wind(nr&,TRUE,"v",1)
  13844.       CASE 4       ! links h-Regler
  13845.         ~@arrow_wind(nr&,TRUE,"PG<",0)
  13846.       CASE 5       ! rechts h-Regler
  13847.         ~@arrow_wind(nr&,TRUE,"PG>",0)
  13848.       CASE 6       ! Pfeil links
  13849.         ~@arrow_wind(nr&,TRUE,"<",1)
  13850.       CASE 7       ! Pfeil rechts
  13851.         ~@arrow_wind(nr&,TRUE,">",1)
  13852.       ENDSELECT
  13853.     CASE 25        ! WM_HSLID
  13854.       ~WIND_GET(winlib_handles&(nr&),4,dummy&,dummy&,w&,dummy&)
  13855.       SUB w&,winlib_x_off&(nr&)
  13856.       ~WIND_GET(winlib_handles&(nr&),8,help&,dummy&,dummy&,dummy&)
  13857.       IF help&<>MENU(5)
  13858.         help%=winlib_hor_off%(nr&)
  13859.         winlib_hor_off%(nr&)=MENU(5)*(winlib_w%(nr&)-winlib_x_off&(nr&)-w&)/1000
  13860.         @adjust_hor_off(nr&,w&)
  13861.         IF help%<>winlib_hor_off%(nr&)
  13862.           help&=@slider_pos(w&,SUB(winlib_w%(nr&),winlib_x_off&(nr&)),winlib_hor_off%(nr&))
  13863.           ~WIND_SET(winlib_handles&(nr&),8,help&,0,0,0)
  13864.           @redraw_part(nr&,0)
  13865.         ENDIF
  13866.       ENDIF
  13867.     CASE 26        ! WM_VSLID
  13868.       ~WIND_GET(winlib_handles&(nr&),4,dummy&,dummy&,dummy&,h&)
  13869.       SUB h&,winlib_y_off&(nr&)
  13870.       ~WIND_GET(winlib_handles&(nr&),9,help&,dummy&,dummy&,dummy&)
  13871.       IF help&<>MENU(5)
  13872.         help%=winlib_ver_off%(nr&)
  13873.         winlib_ver_off%(nr&)=MENU(5)*(winlib_h%(nr&)-winlib_y_off&(nr&)-h&)/1000
  13874.         @adjust_ver_off(nr&,h&)
  13875.         IF help%<>winlib_ver_off%(nr&)
  13876.           help&=@slider_pos(h&,SUB(winlib_h%(nr&),winlib_y_off&(nr&)),winlib_ver_off%(nr&))
  13877.           ~WIND_SET(winlib_handles&(nr&),9,help&,0,0,0)
  13878.           @redraw_part(nr&,0)
  13879.         ENDIF
  13880.       ENDIF
  13881.     DEFAULT
  13882.       @handle_xmsg
  13883.     ENDSELECT
  13884.   ELSE
  13885.     @handle_xmsg
  13886.   ENDIF
  13887. RETURN
  13888. > PROCEDURE button_event   ! Name garantiert, Aufruf nur über ON MENU BUTTON
  13889.   ' menu(12): Taste, 0=keine, 1=links, 2=rechts, 3=beide
  13890.   '           3 (beide) sollte man nicht verwenden, da man meistens noch
  13891.   '           eine einzelne Taste nachgeliefert bekommt (Loslassen)
  13892.   ' menu(15): Anzahl Mausklicks
  13893.   ' menu(10): x-Position
  13894.   ' menu(11): y-Position
  13895.   @button_wind(MENU(12),MENU(15),MENU(10),MENU(11))
  13896. RETURN
  13897. ' ### noch zu überarbeiten:
  13898. > PROCEDURE change_wind(nr&,w%,h%,cellw&,cellh&,x_off&,y_off&,flags%)
  13899.   LOCAL vs!,hs!
  13900.   '
  13901.   ' Mit dieser Prozedur kann man einige Werte eines Fensters ändern.
  13902.   ' Die Attribute (attr) eines Fensters können _nicht_ nachträglich geändert
  13903.   ' werden!!
  13904.   '
  13905.   ' Bedeutung der Parameter wie bei define_wind, jeweils muß
  13906.   ' der neue Wert angegeben werden; ist einer der Parameter
  13907.   ' kleiner null, wird dieser Wert _nicht_ geändert
  13908.   '
  13909.   IF winlib_handles&(nr&)>0
  13910.     IF w%>-1
  13911.       ADD w%,winlib_x_off&(nr&)
  13912.       winlib_w%(nr&)=w%
  13913.       hs!=TRUE
  13914.     ENDIF
  13915.     IF h%>-1
  13916.       ADD h%,winlib_y_off&(nr&)
  13917.       winlib_h%(nr&)=h%
  13918.       vs!=TRUE
  13919.     ENDIF
  13920.     IF cellw&>0
  13921.       winlib_cell_w&(nr&)=cellw&
  13922.     ENDIF
  13923.     IF cellh&>0
  13924.       winlib_cell_h&(nr&)=cellh&
  13925.     ENDIF
  13926.     IF x_off&>-1
  13927.       SUB winlib_w%(nr&),winlib_x_off&(nr&)
  13928.       winlib_x_off&(nr&)=x_off&
  13929.       ADD winlib_w%(nr&),x_off&
  13930.     ENDIF
  13931.     IF y_off&>-1
  13932.       SUB winlib_h%(nr&),winlib_y_off&(nr&)
  13933.       winlib_y_off&(nr&)=y_off&
  13934.       ADD winlib_h%(nr&),y_off&
  13935.     ENDIF
  13936.     IF flags%>-1
  13937.       winlib_flags&(nr&)=flags%
  13938.     ENDIF
  13939.     '
  13940.     IF vs!
  13941.       @set_v_slider(nr&)
  13942.     ENDIF
  13943.     IF hs!
  13944.       @set_h_slider(nr&)
  13945.     ENDIF
  13946.   ENDIF
  13947. RETURN
  13948. '
  13949. > FUNCTION compiled
  13950.   $F% ! 3.1.93 sm
  13951.   ' benötigt: -
  13952.   ' wird benötigt von: init_xrsrc(), init_mydial()
  13953.   ' Rückgabe: BOOLEAN (TRUE, falls compiliert, sonst FALSE)
  13954.   RETURN (BYTE{BASEPAGE+256}<>96)   ! s. ST-Computer 9/91
  13955. ENDFUNC
  13956. '
  13957. ' **********************************************************************
  13958. > PROCEDURE global_exit   ! wurde geändert 31.11.93 S.Heene
  13959.   IF demoversion%=TRUE
  13960.     dummy%=@rsc_alert(1,"Geld_her! 4.6 erhalten|Sie für DM 999.- bei|RIGHTWARE GbR|Holzstr. 13, 80469 München|Tel. 089/2605045 Fax 2608212"," [OK ",1)
  13961.   ENDIF
  13962.   ' wird benötigt von: init_xrsrc(), init_mydial()
  13963.   '
  13964.   ' hier Aufräumaktionen des Hauptprogramms:
  13965.   ' ========================
  13966.   ' FORDERUNGSBERECHNUNG SPEICHERN
  13967.   ' =========================
  13968.   IF aufstellungsaenderung#=TRUE  ! also seit letztem Speichern geändert
  13969.     beenden%=@rsc_alert(1,"Aufstellung wurde geändert.|Arbeit speichern ?"," [Ja |[Nein|[Zurück",1)
  13970.     IF beenden%=1
  13971.       GOSUB diskspeichern
  13972.     ELSE IF beenden%=2
  13973.       ' NICHT SPEICHERN
  13974.     ELSE IF beenden%=3
  13975.       GOTO dochkeinende
  13976.     ENDIF
  13977.   ENDIF
  13978.   ' =======================
  13979.   ' SPEICHERN DER OPTIONEN
  13980.   ' ======================
  13981.   IF optionsaenderung%=TRUE  ! Dann wurden optionen geändert
  13982.     GOSUB mausform(8)
  13983.     GOSUB optionenspeichern
  13984.     DEFMOUSE 0
  13985.   ENDIF
  13986.   ' '
  13987.   ' =======================
  13988.   ' SPEICHERN DER DATENBANK
  13989.   ' ======================
  13990.   IF db_aenderung%=TRUE
  13991.     GOSUB mausform(8)
  13992.     @datenbank_sichern
  13993.     DEFMOUSE 0
  13994.   ENDIF
  13995.   '
  13996.   '
  13997.   @main_exit
  13998.   '
  13999.   ' diese Aktionen sind notwendig - nicht löschen:
  14000.   GEMSYS 109                                        ! Nur ab GEM 1.04!
  14001.   rsc_exit
  14002.   '  ON ERROR  ! schaltet auf GFA Fehlerroutinen zurück
  14003.   IF @compiled=TRUE  ! evtl. hier der Fehler ?
  14004.     SYSTEM (0) !  Null=fehlerfreies Programmende QUIT(0) / END   ! und tschüss
  14005.   ELSE
  14006.     EDIT
  14007.   ENDIF
  14008. dochkeinende:
  14009. RETURN
  14010. ' ***************************************************************
  14011. ' ------------------------------------------------------------------------------
  14012. ' -                        ERGO-TOOLS für GFA-BASIC 3.x                        -
  14013. ' -            Vertrieb: Columbus Soft, Kinzigweg 1, 64297 Darmstadt           -
  14014. ' ------------------------------------------------------------------------------
  14015. ' - 'Fliegende Dialoge' für GFA-BASIC 3.x                                      -
  14016. ' - Version 4.8, Fensterdialoge                                                -
  14017. ' - von Gregor Duchalski, letzte Änderung 28.02.94                             -
  14018. ' ------------------------------------------------------------------------------
  14019. > PROCEDURE rsc_init  ! geändert
  14020.   LOCAL a&
  14021.   '
  14022.   ' Initialisiert die von den RSC-Routinen benötigten Variablen...
  14023.   trees&=50  ! geändert, max 50 Bäume
  14024.   DIM rsc_adr%(trees&),rsc_handle%(trees&)  ! "
  14025.   DIM rscx&(trees&),rscy&(trees&),rscw&(trees&),rsch&(trees&)  ! "
  14026.   '
  14027.   ap_id&=APPL_INIT()                         ! Applikations-ID
  14028.   '
  14029.   rsc_aes&=INT{{ADD(GB,4)}}                  ! AES-Version
  14030.   rsc_mtsk!=INT{ADD({ADD(GB,4)},2)}<>1       ! Multitasking?
  14031.   rsc_alert&=-1                              ! Noch keine fliegenden Alerts
  14032.   '
  14033.   CONTRL(6)=GRAF_HANDLE(wchar&,hchar&,a&,a&) ! AES-Handle, Zeichenbreite/Höhe
  14034.   rsc_vh&=V_OPNVWK(1)                        ! Virt.Workst. für Flydials öffnen
  14035.   IF rsc_vh&=0
  14036.     rsc_vh&=V~H                              ! ...Fehler, dann eben die alte
  14037.   ENDIF
  14038.   CONTRL(6)=V~H
  14039.   '
  14040.   INTIN(0)=1
  14041.   VDISYS 102,1,0
  14042.   planes&=INTOUT(4)                          ! Bitplanes
  14043.   '
  14044.   '
  14045.   ~WIND_GET(0,7,deskx&,desky&,deskw&,deskh&) ! Hintergrundfenster
  14046.   ' ------------------------------------------------------ Inline vorbereiten
  14047. ' ## INLINE:
  14048. ' $0000: 00 24 01 48 02 32 02 ee 03 4a 03 b4 05 76 05 a0 
  14049. ' $0010: 06 24 07 60 07 d6 00 0f df e0 00 05 00 08 00 10 
  14050. ' $0020: 00 00 00 00 20 2f 00 04 48 e7 7f fe 61 00 09 ce 
  14051. ' $0030: 70 00 61 00 08 74 61 00 07 d8 66 44 30 3a ff e0 
  14052. ' $0040: b0 7c 00 08 67 1c b0 7c 00 10 66 34 32 2e 00 08 
  14053. ' $0050: 08 01 00 00 66 06 41 fa 0a 2a 60 1a 41 fa 0a 44 
  14054. ' $0060: 60 14 32 2e 00 08 08 01 00 00 66 06 41 fa 0a 54 
  14055. ' $0070: 60 04 41 fa 0a 5e 72 01 61 00 05 5e 60 00 01 70 
  14056. ' $0080: 4c ae 00 03 00 0a d0 7a ff 94 34 2e 00 10 e2 42 
  14057. ' $0090: 36 02 d2 42 53 41 34 3a ff 84 53 42 38 3a ff 80 
  14058. ' $00a0: b8 7c 00 08 67 02 53 43 48 94 00 0f 78 00 3a 3c 
  14059. ' $00b0: 0e 10 61 00 07 da 61 00 07 58 67 4a 70 01 61 00 
  14060. ' $00c0: 07 e8 30 3a ff 5e 61 00 07 f0 4c 94 00 0f 61 00 
  14061. ' $00d0: 07 be 70 01 61 00 08 38 30 14 38 3c 03 20 3a 3c 
  14062. ' $00e0: 07 6c 61 00 07 90 70 00 61 00 08 24 30 14 38 3c 
  14063. ' $00f0: 0a 28 3a 3c 00 64 61 00 07 7c 70 01 61 00 08 10 
  14064. ' $0100: 70 03 61 00 07 c4 30 2e 00 08 c0 7c 00 01 67 00 
  14065. ' $0110: 00 de 70 01 61 00 07 92 70 01 61 00 07 9c 4c 94 
  14066. ' $0120: 00 0f 57 42 57 43 38 3a fe f6 b8 7c 00 08 66 04 
  14067. ' $0130: 53 42 52 43 78 00 3a 3c 0e 0f 61 00 07 52 70 00 
  14068. ' $0140: 61 00 07 66 60 00 00 a8 20 2f 00 04 48 e7 7f fe 
  14069. ' $0150: 61 00 08 aa 70 00 61 00 07 50 4c ae 00 0f 00 0a 
  14070. ' $0160: d6 41 34 00 d4 7a fe b6 d4 7a fe b2 55 42 55 43 
  14071. ' $0170: 48 94 00 0f 61 00 07 62 61 00 06 96 67 0e 3f 3c 
  14072. ' $0180: 00 00 3f 3c 00 01 61 00 03 74 58 8f 30 2e 00 08 
  14073. ' $0190: 08 00 00 02 67 32 70 02 61 00 07 0e 70 02 61 00 
  14074. ' $01a0: 07 28 70 00 61 00 06 ac 4c 94 00 0f 53 42 53 43 
  14075. ' $01b0: 61 00 07 26 70 01 61 00 06 9a 70 01 61 00 07 0a 
  14076. ' $01c0: 70 00 61 00 06 e4 60 26 08 00 00 00 67 20 4c 94 
  14077. ' $01d0: 00 0f 61 00 06 3c 67 08 54 40 54 41 55 42 55 43 
  14078. ' $01e0: 61 00 07 08 3c 02 34 00 30 06 61 00 06 fe 30 2e 
  14079. ' $01f0: 00 06 b0 6e 00 08 66 36 61 00 06 16 67 06 70 02 
  14080. ' $0200: 61 00 06 c6 4c ae 00 03 00 0a d0 7a fe 10 d0 7a 
  14081. ' $0210: fe 0c d0 7a fe 08 34 2e 00 10 36 3a fe 02 e6 43 
  14082. ' $0220: 94 43 d2 42 53 41 24 2e 00 1a 61 00 07 12 60 00 
  14083. ' $0230: 07 ea 20 2f 00 04 48 e7 7f fe 61 00 07 c0 4c ae 
  14084. ' $0240: 00 0f 00 0a 38 3a fd d8 e2 44 d2 44 96 44 48 94 
  14085. ' $0250: 00 0f d4 40 d6 41 53 42 53 43 3a 00 61 00 05 b2 
  14086. ' $0260: 67 20 70 01 61 00 06 42 30 3a fd b8 61 00 06 4a 
  14087. ' $0270: 30 05 61 00 06 64 70 01 61 00 06 3e 70 00 61 00 
  14088. ' $0280: 06 28 4c 94 00 0f 38 00 3a 01 d8 42 da 43 34 00 
  14089. ' $0290: 36 05 61 00 06 68 34 04 36 01 61 00 06 60 4c ae 
  14090. ' $02a0: 00 03 00 0a d0 7a fd 76 d2 7a fd 74 55 41 24 2e 
  14091. ' $02b0: 00 1a 61 00 05 5c 67 2c 48 94 00 03 70 04 61 00 
  14092. ' $02c0: 06 08 30 3a fd 5e 61 00 06 56 30 14 61 00 06 70 
  14093. ' $02d0: 70 01 61 00 06 4a 70 02 61 00 05 ee 4c 94 00 03 
  14094. ' $02e0: 24 2e 00 1a 61 00 06 58 60 00 07 30 4e 75 20 2f 
  14095. ' $02f0: 00 04 48 e7 7f fe 61 00 07 04 61 00 05 14 67 06 
  14096. ' $0300: 70 02 61 00 05 c4 39 7c ff ff 00 04 36 3a fd 10 
  14097. ' $0310: e6 43 4c ae 00 03 00 0a d2 6e 00 10 92 43 20 6e 
  14098. ' $0320: 00 1a 0c 10 00 20 66 02 52 88 24 08 61 00 06 10 
  14099. ' $0330: 4c ae 00 07 00 0a d4 40 d2 6e 00 10 52 41 36 01 
  14100. ' $0340: 7c 02 61 00 05 a6 60 00 06 d2 20 2f 00 04 48 e7 
  14101. ' $0350: 7f fe 61 00 06 a8 61 00 04 b8 67 10 70 01 61 00 
  14102. ' $0360: 05 48 30 3a fc be 61 00 05 50 60 06 70 00 61 00 
  14103. ' $0370: 05 38 4c ae 00 0f 00 0a d4 40 d6 41 57 40 55 41 
  14104. ' $0380: 54 42 56 43 38 02 3a 03 34 00 61 00 05 a2 61 00 
  14105. ' $0390: 05 6c 34 04 36 05 61 00 05 52 4c ae 00 0f 00 0a 
  14106. ' $03a0: 38 00 3a 01 d8 42 da 43 34 00 36 05 61 00 05 4e 
  14107. ' $03b0: 60 00 06 68 20 2f 00 04 48 e7 7f fe 61 00 06 3e 
  14108. ' $03c0: 61 00 03 8c 3a 29 00 06 e0 45 ba 3c 00 1c 67 54 
  14109. ' $03d0: 7a 00 08 06 00 01 67 02 52 45 08 06 00 02 67 02 
  14110. ' $03e0: 52 45 70 00 61 00 04 c2 70 01 61 00 04 cc 4c ae 
  14111. ' $03f0: 00 0f 00 0a d4 40 d6 41 53 42 53 43 48 94 00 0f 
  14112. ' $0400: 61 00 04 d6 52 40 52 41 53 42 53 43 51 cd ff ee 
  14113. ' $0410: 61 00 03 fe 67 0e 3f 3c 00 01 3f 3c 00 00 61 00 
  14114. ' $0420: 00 dc 58 8f 30 2e 00 08 08 00 00 00 67 4a 70 03 
  14115. ' $0430: 61 00 04 96 61 00 03 da 67 16 70 00 61 00 04 e0 
  14116. ' $0440: 3f 3c 00 00 3f 3c 00 01 61 00 00 b2 58 8f 60 28 
  14117. ' $0450: 70 00 61 00 03 fe 70 01 61 00 04 4e 4c 94 00 0f 
  14118. ' $0460: 52 40 52 41 53 42 53 43 61 00 04 6e 70 01 61 00 
  14119. ' $0470: 03 e2 70 00 61 00 04 32 61 00 03 96 67 06 70 02 
  14120. ' $0480: 61 00 04 46 22 6e 00 1a 61 5e c0 fa fb 90 74 00 
  14121. ' $0490: ba 3c 00 1c 67 08 34 2e 00 0e 94 40 e2 42 30 2e 
  14122. ' $04a0: 00 0a d0 42 32 2e 00 0c 34 2e 00 10 e2 42 d2 42 
  14123. ' $04b0: 38 3a fb 6c e2 44 d2 44 55 41 b8 7c 00 08 66 02 
  14124. ' $04c0: 53 41 61 00 03 4c 67 0e 34 2e 00 08 08 02 00 00 
  14125. ' $04d0: 67 04 52 40 52 41 24 2e 00 1a 61 00 04 62 70 01 
  14126. ' $04e0: 61 00 04 3c 60 00 05 34 70 00 12 19 4a 01 67 0a 
  14127. ' $04f0: b2 3c 00 5b 67 f4 52 40 60 f0 4e 75 70 01 61 00 
  14128. ' $0500: 03 a8 30 3a fb 1e 61 00 03 b0 4c 94 00 0f 61 00 
  14129. ' $0510: 03 c8 70 01 61 00 03 b2 30 2f 00 04 61 00 03 f0 
  14130. ' $0520: 30 14 32 2c 00 06 53 41 34 14 36 2c 00 02 38 2c 
  14131. ' $0530: 00 04 53 44 3a 2c 00 02 61 00 03 c2 30 2f 00 06 
  14132. ' $0540: 61 00 03 cc 30 14 52 40 32 2c 00 06 34 2c 00 04 
  14133. ' $0550: 36 2c 00 06 38 2c 00 04 3a 2c 00 02 52 45 61 00 
  14134. ' $0560: 03 9c 70 01 61 00 03 a8 70 01 61 00 03 4c 70 00 
  14135. ' $0570: 61 00 03 36 4e 75 20 2f 00 04 48 e7 7f fe 61 00 
  14136. ' $0580: 04 7c 41 fa 04 ce 70 10 32 3a fa 94 b2 7c 00 10 
  14137. ' $0590: 64 06 41 fa 04 de 70 08 72 02 61 3c 60 00 04 7c 
  14138. ' $05a0: 20 2f 00 04 48 e7 7f fe 61 00 04 52 61 00 02 94 
  14139. ' $05b0: 4c ae 00 0f 00 0a e2 43 d4 40 d2 43 53 41 36 01 
  14140. ' $05c0: 48 94 00 0f 61 00 03 24 4c 94 00 0f 52 41 52 43 
  14141. ' $05d0: 61 00 03 18 60 00 04 44 3f 01 3f 2e 00 0c 32 2e 
  14142. ' $05e0: 00 0a 53 41 3f 01 3f 00 3f 3c 00 10 3f 3c 00 00 
  14143. ' $05f0: 3f 3c 00 00 3f 3c 00 00 3f 3c 00 00 3f 3c 00 00 
  14144. ' $0600: 3f 3c 00 00 2f 3c 00 00 00 00 3f 3c 00 01 3f 3c 
  14145. ' $0610: 00 00 3f 00 3f 3c 00 10 2f 08 61 08 df fc 00 00 
  14146. ' $0620: 00 26 4e 75 20 2f 00 04 48 e7 7f fe 2a 7a f9 e8 
  14147. ' $0630: 49 fa 04 14 20 55 39 68 00 0c 00 0a 76 79 78 03 
  14148. ' $0640: 3a 2f 00 60 30 2f 00 46 b0 6f 00 52 66 10 76 6d 
  14149. ' $0650: 78 01 ba 7c 00 01 66 04 7a 03 60 02 7a 06 41 fa 
  14150. ' $0660: 04 82 20 ef 00 3c 30 2f 00 40 30 c0 30 ef 00 42 
  14151. ' $0670: d0 7c 00 0f e8 40 30 c0 30 ef 00 44 30 af 00 46 
  14152. ' $0680: 41 fa 04 74 20 ef 00 48 30 2f 00 4c 30 c0 30 ef 
  14153. ' $0690: 00 4e d0 7c 00 0f e8 40 30 c0 30 ef 00 50 30 af 
  14154. ' $06a0: 00 52 20 7a f9 72 22 68 00 04 32 c5 32 fc 00 01 
  14155. ' $06b0: 32 bc 00 00 22 68 00 08 32 ef 00 54 32 ef 00 56 
  14156. ' $06c0: 30 2f 00 58 53 40 32 2f 00 5a 53 41 32 af 00 54 
  14157. ' $06d0: d1 59 32 af 00 56 d3 59 32 ef 00 5c 32 ef 00 5e 
  14158. ' $06e0: 32 af 00 5c d1 59 32 af 00 5e d3 59 22 50 32 83 
  14159. ' $06f0: 33 7c 00 04 00 02 33 7c 00 00 00 04 33 44 00 06 
  14160. ' $0700: 33 7c 00 00 00 08 33 7c 00 00 00 0a 33 7a f9 0c 
  14161. ' $0710: 00 0c 45 fa 03 ce 20 0a 33 40 00 10 48 40 33 40 
  14162. ' $0720: 00 0e 45 fa 03 d2 20 0a 33 40 00 14 48 40 33 40 
  14163. ' $0730: 00 12 22 08 70 73 4e 42 2a 7a f8 dc 49 fa 03 08 
  14164. ' $0740: 20 55 31 6c 00 0a 00 0c 4c df 7f fe 4e 75 22 56 
  14165. ' $0750: 3c 2e 00 04 cc fc 00 18 d3 c6 3c 29 00 08 4e 75 
  14166. ' $0760: 20 2f 00 04 48 e7 7f fe 20 40 32 2f 00 40 c2 fc 
  14167. ' $0770: 00 18 d1 c1 30 28 00 06 20 68 00 0c b0 3c 00 18 
  14168. ' $0780: 66 06 20 68 00 04 e0 40 b0 3c 00 14 67 0c b0 3c 
  14169. ' $0790: 00 19 67 06 b0 3c 00 1b 66 14 20 08 e0 80 e0 80 
  14170. ' $07a0: e0 80 41 fa 02 a2 10 80 42 28 00 01 60 20 b0 3c 
  14171. ' $07b0: 00 1a 67 1a b0 3c 00 1c 67 14 b0 3c 00 20 67 0e 
  14172. ' $07c0: b0 3c 00 1f 66 06 20 68 00 08 60 02 20 50 20 08 
  14173. ' $07d0: 4c df 7f fe 4e 75 20 2f 00 04 48 e7 7f fe 26 00 
  14174. ' $07e0: 42 a7 3f 3c 00 20 4e 41 2f 40 00 02 20 79 00 00 
  14175. ' $07f0: 05 a0 67 0c 22 18 20 18 b2 83 67 06 4a 81 66 f4 
  14176. ' $0800: 70 00 26 00 4e 41 5c 8f 20 03 4c df 7f fe 4e 75 
  14177. ' $0810: 3c 3a f8 0e 67 08 61 00 ff 36 cc 7c 06 00 4e 75 
  14178. ' $0820: 22 6d 00 04 32 bc 00 01 d4 40 53 42 d6 41 53 43 
  14179. ' $0830: 22 6d 00 08 48 91 00 0f 2c 3c 81 01 00 02 60 00 
  14180. ' $0840: 01 70 22 6d 00 04 42 51 2c 3c 81 01 00 02 60 00 
  14181. ' $0850: 01 60 22 6d 00 04 32 80 2c 3c 68 01 00 00 60 00 
  14182. ' $0860: 01 50 22 6d 00 08 48 91 00 0f 2c 3c 0b 00 05 02 
  14183. ' $0870: 60 00 01 3e 22 6d 00 08 48 91 00 0f 22 6d 00 04 
  14184. ' $0880: 48 91 00 30 2c 3c 0b 02 06 02 60 00 01 24 22 6d 
  14185. ' $0890: 00 08 48 91 00 0f 22 6d 00 04 48 91 00 30 2c 3c 
  14186. ' $08a0: 0b 02 07 02 60 00 01 0a 22 6d 00 04 32 80 2c 3c 
  14187. ' $08b0: 17 01 00 00 60 00 00 fa 22 6d 00 04 32 80 2c 3c 
  14188. ' $08c0: 19 01 00 00 60 00 00 ea 22 6d 00 04 32 80 2c 3c 
  14189. ' $08d0: 20 01 00 00 60 00 00 da 22 6d 00 08 48 91 00 0f 
  14190. ' $08e0: 2c 3c 0b 00 01 02 60 00 00 c8 22 6d 00 08 48 91 
  14191. ' $08f0: 00 0f 2c 3c 06 00 00 02 60 00 00 b6 22 6d 00 08 
  14192. ' $0900: 48 91 00 3f 2c 3c 06 00 00 03 60 00 00 a4 22 6d 
  14193. ' $0910: 00 04 32 80 2c 3c 11 01 00 00 60 00 00 94 22 6d 
  14194. ' $0920: 00 04 32 80 2c 3c 16 01 00 00 60 00 00 84 22 6d 
  14195. ' $0930: 00 08 48 91 00 3f 2c 3c 09 00 00 03 60 72 22 6d 
  14196. ' $0940: 00 08 48 91 00 03 48 94 00 03 22 6d 00 04 20 42 
  14197. ' $0950: 70 00 72 00 74 00 39 7c ff ff 00 06 42 6c 00 04 
  14198. ' $0960: 52 41 10 18 b0 3c 00 5b 66 08 d5 54 42 6c 00 06 
  14199. ' $0970: 60 f0 d4 7a f6 a8 32 c0 66 e6 2c 3c 08 ff 00 01 
  14200. ' $0980: 53 41 20 55 31 41 00 06 4a 6c 00 04 6b 22 4a 6c 
  14201. ' $0990: 00 06 6b 1c 61 1a 4c 94 00 03 34 3a f6 82 e6 42 
  14202. ' $09a0: d2 42 36 01 34 00 d4 7a f6 74 53 42 60 00 ff 3c 
  14203. ' $09b0: 48 e7 ff fe 20 55 42 68 00 04 42 68 00 08 42 68 
  14204. ' $09c0: 00 02 11 46 00 03 42 68 00 0a e0 8e 11 46 00 0b 
  14205. ' $09d0: e0 8e bc 3c 00 ff 67 08 42 68 00 06 11 46 00 07 
  14206. ' $09e0: 42 50 e0 8e 11 46 00 01 31 7a f6 30 00 0c 22 0d 
  14207. ' $09f0: 30 3c 00 73 4e 42 4c df 7f ff 4e 75 2c 40 2a 7a 
  14208. ' $0a00: f6 16 49 fa 00 42 20 55 39 68 00 0c 00 08 4c ae 
  14209. ' $0a10: 00 0f 00 12 61 00 fe 0a 4e 75 70 01 61 00 fe aa 
  14210. ' $0a20: 61 00 fe 20 20 55 31 6c 00 08 00 0c 30 2e 00 08 
  14211. ' $0a30: 08 80 00 00 08 80 00 01 08 80 00 02 08 80 00 04 
  14212. ' $0a40: 4c df 7f fe 4e 75 01 1c 00 ee 00 00 00 00 00 03 
  14213. ' $0a50: 00 03 80 00 80 00 89 e0 8e 18 8e 04 80 04 90 02 
  14214. ' $0a60: 90 02 90 02 90 02 88 00 88 1c 86 1c 81 e4 80 00 
  14215. ' $0a70: 80 00 80 00 93 f0 9c 0c 9c 00 80 1c 98 1c 87 e4 
  14216. ' $0a80: 80 00 03 e0 0c 18 10 04 20 02 20 02 40 01 40 01 
  14217. ' $0a90: 40 01 40 01 40 01 20 02 20 02 10 04 0c 18 03 e0 
  14218. ' $0aa0: 00 00 03 e0 0c 18 11 c4 27 f2 2f fa 4f f9 5f fd 
  14219. ' $0ab0: 5f fd 5f fd 4f f9 2f fa 27 f2 11 c4 0c 18 03 e0 
  14220. ' $0ac0: 00 00 07 c0 08 20 10 10 10 10 10 10 10 10 08 20 
  14221. ' $0ad0: 07 c0 07 c0 08 20 17 d0 17 d0 17 d0 17 d0 08 20 
  14222. ' $0ae0: 07 c0 00 26 bd a8 00 ee 00 5d 00 0f 00 00 00 01 
  14223. ' $0af0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  14224. ' $0b00: 00 00 00 01 00 00 00 00 00 00 54 53 4e 5f 53 59 
  14225. ' $0b10: 4c 51 
  14226. ' 2834  Bytes.
  14227.   INLINE rsc_flyd%,2834
  14228.   '
  14229.   rsc_bitblt%=ADD(rsc_flyd%,INT{ADD(rsc_flyd%,16)})      ! BITBLT-Routine
  14230.   rsc_obspec%=ADD(rsc_flyd%,INT{ADD(rsc_flyd%,18)})      ! OB_SPEC-Routine...
  14231.   rsc_cookie%=ADD(rsc_flyd%,INT{ADD(rsc_flyd%,20)})      ! COOKIE-Routine...
  14232.   '
  14233.   {ADD(rsc_flyd%,22)}=ADD(GB,24)                         ! VDI-Parameterblock
  14234.   INT{ADD(rsc_flyd%,26)}=rsc_vh&                         ! Virt. Workstation
  14235.   INT{ADD(rsc_flyd%,28)}=wchar&                          ! Zeichenzellenbreite
  14236.   INT{ADD(rsc_flyd%,30)}=hchar&                          ! Zeichenzellenhöhe
  14237.   ' ------------------------------------------------------
  14238.   ' Berechnet den Speicherbedarf einer Bitmap-Grafik...
  14239.   DEFFN getsize(w&,h&)=SHL(SHR(ADD(MUL(MUL(SHR(ADD(w&,15),3),h&),planes&),255),8),8)
  14240.   '
  14241.   ' Gegenstück zur Prozedur rsc_text: Universelles Objekt-Text auslesen...
  14242.   DEFFN rsc_text$(tree&,obj&)=CHAR{C:rsc_obspec%(L:rsc_adr%(tree&),obj&)}
  14243.   '
  14244. RETURN
  14245. > PROCEDURE rsc_exit  ! Geändert 17.11.94
  14246.   ERASE rsc_adr%(),rsc_handle%()  ! Geändert eingefügt
  14247.   ERASE rscx&(),rscy&(),rscw&(),rsch&()  ! eingefügt
  14248.   '
  14249.   CONTRL(6)=rsc_vh&
  14250.   VDISYS 38,0,0                              ! vqt_attributes
  14251.   IF ABS(INTOUT(0))<>1                       ! Anderer AES-Zeichensatz (MTOS)...
  14252.     ~VST_UNLOAD_FONTS(0)                     ! ...freigeben
  14253.   ENDIF
  14254.   '
  14255.   IF rsc_vh&<>V~H                            ! Flydial-Workstation freigeben...
  14256.     ~V_CLSVWK()
  14257.   ENDIF
  14258.   '
  14259.   ' Die folgenden Zeilen sind nur im Interpreter relevant und können im
  14260.   ' Compilat wegfallen. Tip: Mit dem ERGO!pro-Präprozessor ausblenden.
  14261.   '
  14262.   ~RSRC_FREE()                               ! Resource entfernen
  14263.   '
  14264.   IF popup_back%
  14265.     ~MFREE(popup_back%)                      ! Popup-Hintergrund freigeben
  14266.   ENDIF
  14267.   '
  14268.   IF rsc_userblk%
  14269.     ~MFREE(rsc_userblk%)                     ! Userblks freigeben
  14270.   ENDIF
  14271.   '
  14272. RETURN
  14273. '
  14274. > FUNCTION rsc_laden(file$,trees&,popup&,menu&,alert&)  ! geändert
  14275.   $F%
  14276.   LOCAL tree&,obj&,font_h&,font_id&,color3d&,a%
  14277.   '
  14278.   ' Lädt die Resource und initialisiert einige globale Variablen...
  14279.   ' ------------------------------------------------------ RSC laden
  14280.   ' Wollen Sie das RSC-File direkt im Programmcode 'aufbewahren'?
  14281.   ' Dann entREMen Sie diese Zeilen und laden Sie die Funktion
  14282.   ' 'rsc_conv' aus EXTENDED.LST hinzu...
  14283.   ' INLINE rsc%,3160
  14284.   ' IF @rsrc_conv(rsc%)=0
  14285.   IF RSRC_LOAD(file$)=0
  14286.     '
  14287.     '
  14288.     ~FORM_ALERT(1,"[3][ | Fehler beim Laden | der RSC-Datei! | ][Abbruch]")
  14289.     RETURN FALSE
  14290.   ENDIF
  14291.   ' ------------------------------------------------------
  14292.   IF trees&=-1                                           ! Anz. Bäume ermitteln...
  14293.     a%={{GB+4}+14}                                       ! GLOBAL(7/8) auslesen
  14294.     trees&=PRED(CARD{a%+22}+CARD{a%+30})                 ! Anzahl Objektbäume-1
  14295.   ENDIF
  14296.   ' ------------------------------------------------------
  14297.   '
  14298.   rsc_trees&=trees&                                      ! Anzahl Objektbäume-1
  14299.   rsc_popup&=popup&                                      ! Popup-Baum
  14300.   rsc_menu&=menu&                                        ! Dropdown-Baum
  14301.   rsc_alert&=alert&                                      ! Alert-Baum
  14302.   ' ------------------------------------------------------
  14303.   ' Die folgenden Zeilen sind nur nötig, wenn das Resource-File ALERT-
  14304.   ' oder FREE-Bäume enthält. Näheres in der Doku.
  14305.   ' alerts&=trees&-SUCC(rsc_alert&)                        ! Alerts & Free Strings...
  14306.   ' FOR tree&=0 TO alerts&
  14307.   ' ~RSRC_GADDR(5,tree&,a%)
  14308.   ' rsc_adr%(rsc_alert&+SUCC(tree&))=a%
  14309.   ' NEXT tree&
  14310.   ' trees&=rsc_alert&
  14311.   ' ------------------------------------------------------ Adressen ermitteln
  14312.   FOR tree&=0 TO trees&
  14313.     '
  14314.     ~RSRC_GADDR(0,tree&,a%)  ! Kompatibel zu den XRSRC-Routinen
  14315.     rsc_adr%(tree&)=a%
  14316.     IF tree&<>h_menu&
  14317.       ~FORM_CENTER(rsc_adr%(tree&),rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  14318.     ENDIF
  14319.     '
  14320.   NEXT tree&
  14321.   ' ------------------------------------------------------ Größtes Popup
  14322.   IF popup&>-1
  14323.     obj&=1
  14324.     '
  14325.     ' =====================================================
  14326.     popup_back%=0  ! eingefügt, muß rückgesetzt werden, da ich mit 2 Resourcen arbeite
  14327.     ' ======================================================
  14328.     WHILE obj&>0
  14329.       popup_back%=MAX(popup_back%,@getsize(ADD(OB_W(rsc_adr%(popup&),obj&),21),OB_H(rsc_adr%(popup&),obj&)))
  14330.       obj&=OB_NEXT(rsc_adr%(popup&),obj&)
  14331.     WEND
  14332.     '
  14333.     popup_back%=MALLOC(popup_back%)                      ! Hintergrundpuffer...
  14334.     IF popup_back%=0
  14335.       RETURN FALSE                                       ! ...nicht geklappt
  14336.     ENDIF
  14337.     '
  14338.   ENDIF
  14339.   ' ------------------------------------------------------ Anderer Zeichensatz
  14340.   IF rsc_aes&>=&H400                                     ! Hat APPL_GETINFO()...
  14341.     '
  14342.     GCONTRL(0)=130
  14343.     GCONTRL(1)=1
  14344.     GCONTRL(2)=5
  14345.     GCONTRL(3)=0
  14346.     GCONTRL(4)=0
  14347.     GINTIN(0)=0
  14348.     '
  14349.     GEMSYS                                               ! APPL_GETINFO()
  14350.     '
  14351.     IF GINTOUT(0)=1                                      ! Hat geklappt...
  14352.       font_h&=GINTOUT(1)                                 ! AES-Font Höhe
  14353.       font_id&=GINTOUT(2)                                ! AES-Font ID
  14354.       '
  14355.       IF ABS(font_id&)<>1 AND GDOS?<>0                   ! Anderer AES-Font...
  14356.         V~H=rsc_vh&
  14357.         ~VST_LOAD_FONTS(0)                               ! ...Fonts laden
  14358.         DEFTEXT ,,,,font_id&
  14359.         DEFTEXT ,,,font_h&                               ! ...und einstellen
  14360.         V~H=-1
  14361.       ENDIF
  14362.     ENDIF
  14363.   ENDIF
  14364.   ' ------------------------------------------------------ 3D-Darstellung
  14365.   IF rsc_aes&>=&H340                                     ! Ab AES 3.40...
  14366.     GCONTRL(0)=48
  14367.     GCONTRL(1)=4
  14368.     GCONTRL(2)=3
  14369.     GCONTRL(3)=0
  14370.     GCONTRL(4)=0
  14371.     '
  14372.     GINTIN(0)=0                                          ! Inquire
  14373.     GINTIN(1)=5                                          ! Background
  14374.     '
  14375.     GEMSYS                                               ! OBJC_SYSVAR()
  14376.     '
  14377.     IF GINTOUT(0)>0                                      ! Hat geklappt...
  14378.       color3d&=GINTOUT(1)                                ! ...3D-Farbe
  14379.     ENDIF
  14380.   ENDIF
  14381.   ' ------------------------------------------------------
  14382.   INT{ADD(rsc_flyd%,32)}=color3d&>0                      ! 3D-Darstellung an/aus
  14383.   INT{ADD(rsc_flyd%,34)}=color3d&                        ! 3D-Farbe
  14384.   ' ------------------------------------------------------
  14385.   IF @rsc_walk_tree(trees&)
  14386.     '    @init_hnumbers  ! überflüssig (PROCEDURE resource_einrichten)
  14387.     RETURN TRUE                                          ! alles ok
  14388.   ENDIF
  14389.   '
  14390.   RETURN FALSE                                           ! Error!
  14391. ENDFUNC
  14392. > FUNCTION rsc_walk_tree(trees&)
  14393.   $F%
  14394.   LOCAL a&,b&,userblk&,tree&,obj&
  14395.   '
  14396.   ' RSC-Baum durchgehen und userdefs installieren...
  14397.   '
  14398.   ' ------------------------------------------------------ Userdefs ermitteln
  14399.   FOR tree&=0 TO trees&
  14400.     '
  14401.     obj&=-1
  14402.     '
  14403.     REPEAT
  14404.       '
  14405.       INC obj&
  14406.       '
  14407.       a&=SHR&(OB_TYPE(rsc_adr%(tree&),obj&),8)           ! Es ist ein userdef...
  14408.       ADD userblk&,-AND(a&>=17,a&<=22)
  14409.       '
  14410.     UNTIL BTST(OB_FLAGS(rsc_adr%(tree&),obj&),5)         ! ...bis LAST_OBJ
  14411.     '
  14412.   NEXT tree&
  14413.   '
  14414.   rsc_userblk%=MALLOC(SHL(SUCC(userblk&),3))             ! Userblks(+1) anfordern (*8)
  14415.   IF rsc_userblk%=0                                      ! Zu wenig Speicher...
  14416.     RETURN FALSE                                         ! ...Error!
  14417.   ENDIF
  14418.   ' ------------------------------------------------------ Objektbäume modifiz.
  14419.   FOR tree&=0 TO trees&
  14420.     '
  14421.     obj&=-1
  14422.     REPEAT
  14423.       '
  14424.       INC obj&
  14425.       '
  14426.       SELECT SHR&(OB_TYPE(rsc_adr%(tree&),obj&),8)       ! OB_TYPE
  14427.         ' ------------------------------------------------ Flydial-Ecke...
  14428.       CASE 17
  14429.         rsc_instal_userdef(tree&,obj&,5)
  14430.         ' ------------------------------------------------ Button/String...
  14431.       CASE 18
  14432.         '
  14433.         a&=OB_FLAGS(rsc_adr%(tree&),obj&)                ! OB_FLAGS
  14434.         b&=BYTE(OB_TYPE(rsc_adr%(tree&),obj&))           ! Alter OB_TYPE
  14435.         '
  14436.         IF BTST(a&,4)                                    ! Radiobutton...
  14437.           rsc_instal_userdef(tree&,obj&,1)
  14438.           '                                              ! BUTTON, nicht EXIT
  14439.         ELSE IF b&=26 AND (NOT BTST(a&,2))               ! Checkbutton...
  14440.           rsc_instal_userdef(tree&,obj&,2)
  14441.           '
  14442.         ELSE                                             ! Normale EXIT-Buttons...
  14443.           '
  14444.           IF b&<>28                                      ! Kein STRING...
  14445.             a&=SUCC(-BTST(a&,1)-BTST(a&,2)-BTST(a&,6))
  14446.             IF a&>1 !EXIT       DEFAULT    TOUCHEXIT
  14447.               OB_X(rsc_adr%(tree&),obj&)=SUB(OB_X(rsc_adr%(tree&),obj&),a&)
  14448.               OB_Y(rsc_adr%(tree&),obj&)=SUB(OB_Y(rsc_adr%(tree&),obj&),a&)
  14449.               OB_W(rsc_adr%(tree&),obj&)=ADD(OB_W(rsc_adr%(tree&),obj&),ADD(a&,a&))
  14450.               OB_H(rsc_adr%(tree&),obj&)=SUCC(ADD(OB_H(rsc_adr%(tree&),obj&),ADD(a&,a&)))
  14451.             ENDIF                                        ! ...für Redraw größer
  14452.           ENDIF
  14453.           '
  14454.           rsc_instal_userdef(tree&,obj&,6)
  14455.           '
  14456.         ENDIF
  14457.         ' ------------------------------------------------ Unterstr. Text...
  14458.       CASE 19
  14459.         rsc_instal_userdef(tree&,obj&,4)
  14460.         OB_FLAGS(rsc_adr%(tree&),obj&)=BSET(OB_FLAGS(rsc_adr%(tree&),obj&),13)
  14461.         ' ...OB_FLAG 13 setzen, wird in 'rsc_draw' benötigt
  14462.         ' ------------------------------------------------ Rahmen...
  14463.       CASE 20
  14464.         rsc_instal_userdef(tree&,obj&,3)
  14465.         ' ------------------------------------------------ Niceline...
  14466.       CASE 21
  14467.         rsc_instal_userdef(tree&,obj&,8)
  14468.         ' ------------------------------------------------ Circlebutton...
  14469.       CASE 22
  14470.         IF hchar&=8 OR hchar&=16                         ! ...nur wenn möglich
  14471.           rsc_instal_userdef(tree&,obj&,7)               ! ...als Bitmap
  14472.         ELSE
  14473.           OB_TYPE(rsc_adr%(tree&),obj&)=OR(SHL&(27,8),BYTE(OB_TYPE(rsc_adr%(tree&),obj&)))
  14474.         ENDIF                                            ! ...sonst Pfeil lassen
  14475.         '
  14476.       ENDSELECT
  14477.       '
  14478.     UNTIL BTST(OB_FLAGS(rsc_adr%(tree&),obj&),5)         ! Bis LAST_OB gesetzt
  14479.     '
  14480.   NEXT tree&
  14481.   '
  14482.   {rsc_userblk%}=0                                       ! Für Nullstrings
  14483.   '
  14484.   RETURN TRUE                                            ! Alles OK
  14485. ENDFUNC
  14486. > PROCEDURE rsc_instal_userdef(tree&,obj&,nr&)
  14487.   '
  14488.   ' Userdef-Objekt installieren...
  14489.   '
  14490.   ' nr& bezeichnet eine der folgenden Ausgaberoutinen:
  14491.   ' 1  Radiobutton, rund
  14492.   ' 2  Check-Button
  14493.   ' 3  Rahmen
  14494.   ' 4  Unterstr. Text
  14495.   ' 5  Flydial
  14496.   ' 6  Button
  14497.   ' 7  Circlebutton
  14498.   ' 8  Niceline
  14499.   '
  14500.   {rsc_userblk%}=ADD(rsc_flyd%,INT{ADD(rsc_flyd%,SHL(PRED(nr&),1))})
  14501.   {ADD(rsc_userblk%,4)}=OB_SPEC(rsc_adr%(tree&),obj&)
  14502.   '
  14503.   OB_SPEC(rsc_adr%(tree&),obj&)=rsc_userblk%             ! userdef und alter Typ
  14504.   OB_TYPE(rsc_adr%(tree&),obj&)=OR(SHL&(BYTE(OB_TYPE(rsc_adr%(tree&),obj&)),8),24)
  14505.   '                                                      ! im oberen Byte
  14506.   ADD rsc_userblk%,8
  14507.   '
  14508. RETURN
  14509. '
  14510. > PROCEDURE rsc_draw(tree&,flag%)
  14511.   LOCAL fly&,title&,obj&,x&,y&,w&,h&,rx&,ry&,rb&,rh&,handle&,a%,rsc_adr%
  14512.   window!=BTST(flag%,0)
  14513.   '
  14514.   ' Stellt einen Dialog auf dem Bildschirm dar...
  14515.   '
  14516.   ' tree&   : Index des Dialogbaumes
  14517.   ' window! : TRUE = Fenster-Dialog, FALSE = normaler Dialog
  14518.   '
  14519.   rsc_adr%=rsc_adr%(tree&)
  14520.   ' --------------------------------------------------- Titel & Flugecke suchen
  14521.   DO WHILE NOT (fly&>0 AND title&>0)
  14522.     INC obj&
  14523.     IF BTST(OB_STATE(rsc_adr%,obj&),1)                ! Flugecke...
  14524.       fly&=obj&
  14525.     ELSE IF BTST(OB_FLAGS(rsc_adr%,obj&),13)          ! Dialogtitel...
  14526.       title&=obj&
  14527.     ENDIF
  14528.   LOOP UNTIL BTST(OB_FLAGS(rsc_adr%,obj&),5)
  14529.   ' --------------------------------------------------- Als Fenster-Dialog
  14530.   IF window!
  14531.     x&=SUCC(rscx&(tree&))
  14532.     y&=ADD(ADD(rscy&(tree&),SHL(hchar&,1)),5)
  14533.     w&=SUB(rscw&(tree&),2)
  14534.     h&=SUB(SUB(rsch&(tree&),SHL(hchar&,1)),5)
  14535.     '
  14536.     IF fly&                                           ! Flugecke hidden...
  14537.       OB_FLAGS(rsc_adr%,fly&)=BSET(OB_FLAGS(rsc_adr%,fly&),7)
  14538.     ENDIF
  14539.     '                                                 ! Rahmen: 1 Pixel außen...
  14540.     OB_SPEC(rsc_adr%,0)=AND(OB_SPEC(rsc_adr%,0),&X11111111000000001111111111111111)
  14541.     '
  14542.     handle&=WIND_CREATE(&X1001,deskx&,desky&,deskw&,deskh&)
  14543.     IF handle&>0                                      ! Fenster vorhanden...
  14544.       '
  14545.       ~WIND_UPDATE(1)                                 ! BEG_UPDATE
  14546.       '
  14547.       INC rsc_window&                                 ! Anz. offene Fenster+1
  14548.       rsc_menu_ienable(FALSE)                         ! Menütitel disablen
  14549.       '
  14550.       IF title&                                       ! Dialogtitel existiert...
  14551.         a%=C:rsc_obspec%(L:rsc_adr%,title&)           ! ...Adresse des Titels
  14552.       ELSE
  14553.         a%=rsc_userblk%                               ! ...sonst Nullstring
  14554.       ENDIF
  14555.       ~WIND_SET(handle&,2,INT(SWAP(a%)),INT(a%),0,0)  ! Fenstertitel setzen
  14556.       '
  14557.       ~WIND_CALC(0,&X1001,x&,y&,w&,h&,rx&,ry&,rb&,rh&)! WC_BORDER
  14558.       ~WIND_OPEN(handle&,rx&,ry&,rb&,rh&)
  14559.       '
  14560.       ~WIND_UPDATE(0)                                 ! END_UPDATE
  14561.       '
  14562.       rsc_handle%(tree&)=handle&
  14563.       '
  14564.     ENDIF
  14565.   ENDIF
  14566.   ' --------------------------------------------------- Als normaler Dialog
  14567.   IF rsc_handle%(tree&)=0
  14568.     a%=AND(OB_SPEC(rsc_adr%,0),&X11111111000000001111111111111111)
  14569.     OB_SPEC(rsc_adr%,0)=OR(a%,SHL(2,16))              ! Rahmen: 2 Pixel innen
  14570.     '
  14571.     w&=rscw&(tree&)
  14572.     h&=rsch&(tree&)
  14573.     '                                                 ! Außerhalb des Screens...
  14574.     IF rscy&(tree&)<desky& OR ADD(rscx&(tree&),PRED(w&))>ADD(deskx&,PRED(deskw&)) OR ADD(rscy&(tree&),PRED(h&))>ADD(desky&,PRED(deskh&))
  14575.       ~FORM_CENTER(rsc_adr%(tree&),rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  14576.     ENDIF                                             ! ...wieder in die Mitte
  14577.     '
  14578.     ~WIND_UPDATE(1)                                   ! BEG_UPDATE
  14579.     '
  14580.     rsc_list$=rsc_list$+MKI$(tree&)                   ! Dialog in die Liste aufnehmen
  14581.     '
  14582.     rsc_handle%(tree&)=MALLOC(@getsize(w&,h&))
  14583.     IF rsc_handle%(tree&)                             ! Hintergrund retten...
  14584.       rsc_bitblt(0,0,0,rsc_handle%(tree&),w&,h&,rscx&(tree&),rscy&(tree&),w&,h&,0,0)
  14585.       '
  14586.     ENDIF
  14587.     '
  14588.     IF fly&>0 AND rsc_handle%(tree&)>0               ! Flugecke sichtbar...
  14589.       OB_FLAGS(rsc_adr%,fly&)=BCLR(OB_FLAGS(rsc_adr%,fly&),7)
  14590.     ELSE IF fly&                                     ! unsichtbar...
  14591.       OB_FLAGS(rsc_adr%,fly&)=BSET(OB_FLAGS(rsc_adr%,fly&),7)
  14592.     ENDIF
  14593.     '                                                ! Zeichnen...
  14594.     ~OBJC_DRAW(rsc_adr%,0,10,rscx&(tree&),rscy&(tree&),w&,h&)
  14595.     '
  14596.   ENDIF
  14597.   '
  14598. RETURN
  14599. > PROCEDURE rsc_draw_neu(tree&,flag%) ! Nicht verwendet, da kein Redraw
  14600.   ' ausgelöst wird, wenn die Dialogbox in die Rahmenelemente des
  14601.   ' Hintergrundfensters ragt
  14602.   LOCAL fly&,title&,obj&,x&,y&,w&,h&,rx&,ry&,rb&,rh&,handle&,a%,rsc_adr%
  14603.   '
  14604.   ' Stellt einen Dialog auf dem Bildschirm dar...
  14605.   '
  14606.   ' tree&   : Index des Dialogbaumes
  14607.   ' flag%   : Bitbelegung
  14608.   '           Bit 0 -> Fensterdialog  z.B. ~BSET(fensterdial%,0)
  14609.   '           Bit 1 -> Schließfeld
  14610.   '           Bit 2 -> Bei Fensterdialogen: Sofort zeichnen
  14611.   '
  14612.   rsc_adr%=rsc_adr%(tree&)
  14613.   ' --------------------------------------------------- Titel & Flugecke suchen
  14614.   DO WHILE NOT (fly&>0 AND title&>0)
  14615.     INC obj&
  14616.     IF BTST(OB_STATE(rsc_adr%,obj&),1)                ! Flugecke...
  14617.       fly&=obj&
  14618.     ELSE IF BTST(OB_FLAGS(rsc_adr%,obj&),13)          ! Dialogtitel...
  14619.       title&=obj&
  14620.     ENDIF
  14621.   LOOP UNTIL BTST(OB_FLAGS(rsc_adr%,obj&),5)
  14622.   ' --------------------------------------------------- Als Fenster-Dialog
  14623.   IF BTST(flag%,0)
  14624.     x&=SUCC(rscx&(tree&))
  14625.     y&=ADD(ADD(rscy&(tree&),SHL(hchar&,1)),5)
  14626.     w&=SUB(rscw&(tree&),2)
  14627.     h&=SUB(SUB(rsch&(tree&),SHL(hchar&,1)),5)
  14628.     '
  14629.     IF fly&                                           ! Flugecke hidden...
  14630.       OB_FLAGS(rsc_adr%,fly&)=BSET(OB_FLAGS(rsc_adr%,fly&),7)
  14631.     ENDIF
  14632.     '                                                 ! Rahmen: 1 Pixel außen...
  14633.     OB_SPEC(rsc_adr%,0)=AND(OB_SPEC(rsc_adr%,0),&X11111111000000001111111111111111)
  14634.     '
  14635.     rx&=OR(&X1001,SHL(-BTST(flag%,1),1))              ! Ggf. Schließfeld
  14636.     handle&=WIND_CREATE(rx&,deskx&,desky&,deskw&,deskh&)
  14637.     IF handle&>0                                      ! Fenster vorhanden...
  14638.       '
  14639.       ~WIND_UPDATE(1)                                 ! BEG_UPDATE
  14640.       '
  14641.       INC rsc_window&                                 ! Anz. offene Fenster+1
  14642.       rsc_menu_ienable(FALSE)                         ! Menütitel disablen
  14643.       '
  14644.       IF title&                                       ! Dialogtitel existiert...
  14645.         a%=C:rsc_obspec%(L:rsc_adr%,title&)           ! ...Adresse des Titels
  14646.       ELSE
  14647.         a%=rsc_userblk%                               ! ...sonst Nullstring
  14648.       ENDIF
  14649.       ~WIND_SET(handle&,2,INT(SWAP(a%)),INT(a%),0,0)  ! Fenstertitel setzen
  14650.       '
  14651.       ~WIND_CALC(0,&X1001,x&,y&,w&,h&,rx&,ry&,rb&,rh&)! WC_BORDER
  14652.       ~WIND_OPEN(handle&,rx&,ry&,rb&,rh&)
  14653.       '
  14654.       rsc_handle%(tree&)=handle&
  14655.       '
  14656.       IF BTST(flag%,2)                                ! Sofort zeichnen...
  14657.         rsc_message(tree&,20,x&,y&,w&,h&,0,0)
  14658.         ~EVNT_MULTI(&X110000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000)
  14659.       ENDIF
  14660.       '
  14661.       ~WIND_UPDATE(0)                                 ! END_UPDATE
  14662.       '
  14663.     ENDIF
  14664.   ENDIF
  14665.   ' --------------------------------------------------- Als normaler Dialog
  14666.   IF rsc_handle%(tree&)=0
  14667.     a%=AND(OB_SPEC(rsc_adr%,0),&X11111111000000001111111111111111)
  14668.     OB_SPEC(rsc_adr%,0)=OR(a%,SHL(2,16))              ! Rahmen: 2 Pixel innen
  14669.     '
  14670.     w&=rscw&(tree&)
  14671.     h&=rsch&(tree&)
  14672.     '                                                 ! Außerhalb des Screens...
  14673.     IF rscy&(tree&)<desky& OR ADD(rscx&(tree&),PRED(w&))>ADD(deskx&,PRED(deskw&)) OR ADD(rscy&(tree&),PRED(h&))>ADD(desky&,PRED(deskh&))
  14674.       ~FORM_CENTER(rsc_adr%(tree&),rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  14675.     ENDIF                                             ! ...wieder in die Mitte
  14676.     '
  14677.     ~WIND_UPDATE(1)                                   ! BEG_UPDATE
  14678.     '
  14679.     rsc_list$=rsc_list$+MKI$(tree&)                   ! Dialog in die Liste aufnehmen
  14680.     '
  14681.     rsc_handle%(tree&)=MALLOC(@getsize(w&,h&))
  14682.     IF rsc_handle%(tree&)                             ! Hintergrund retten...
  14683.       rsc_bitblt(0,0,0,rsc_handle%(tree&),w&,h&,rscx&(tree&),rscy&(tree&),w&,h&,0,0)
  14684.       '
  14685.     ENDIF
  14686.     '
  14687.     IF fly&>0 AND rsc_handle%(tree&)>0               ! Flugecke sichtbar...
  14688.       OB_FLAGS(rsc_adr%,fly&)=BCLR(OB_FLAGS(rsc_adr%,fly&),7)
  14689.     ELSE IF fly&                                     ! unsichtbar...
  14690.       OB_FLAGS(rsc_adr%,fly&)=BSET(OB_FLAGS(rsc_adr%,fly&),7)
  14691.     ENDIF
  14692.     '                                                ! Zeichnen...
  14693.     ~OBJC_DRAW(rsc_adr%,0,10,rscx&(tree&),rscy&(tree&),w&,h&)
  14694.     '
  14695.   ENDIF
  14696.   '
  14697. RETURN
  14698. > PROCEDURE rsc_menu_ienable(stat!)
  14699.   LOCAL obj&,title&,rsc_adr%
  14700.   '
  14701.   ' Disabled/enabled alle Menü-Titel und den 'About...'-Menü-Eintrag...
  14702.   '                                ! Gibt es ein Menü..
  14703.   IF rsc_menu&>-1 AND rsc_window&=1! und ist es das 1. Fenster?
  14704.     '
  14705.     rsc_adr%=rsc_adr%(rsc_menu&)
  14706.     '                              ! Objektbreite verändern...
  14707.     IF stat!                       ! Enablen...
  14708.       OB_W(rsc_adr%,2)=rscw&(rsc_menu&)
  14709.     ELSE                           ! Disablen...
  14710.       rscw&(rsc_menu&)=OB_W(rsc_adr%,2)
  14711.       OB_W(rsc_adr%,2)=OB_W(rsc_adr%,3)
  14712.     ENDIF
  14713.     '
  14714.     obj&=3                         ! Ersten Menütitel überspringen
  14715.     '
  14716.     REPEAT
  14717.       INC obj&
  14718.       '                            ! G_TITEL...
  14719.       IF BYTE(OB_TYPE(rsc_adr%,obj&))=32
  14720.         '
  14721.         ~MENU_IENABLE(rsc_adr%,obj&,stat!)
  14722.         '
  14723.         title&=obj&                ! Wird für 'About...' gebraucht
  14724.       ENDIF
  14725.       '
  14726.     UNTIL BTST(OB_FLAGS(rsc_adr%,obj&),5)
  14727.     '                              ! 'About...' dis/enablen
  14728.     ~MENU_IENABLE(rsc_adr%,ADD(title&,3),stat!)
  14729.     '                              ! Unter MultiTOS...
  14730.     IF (rsc_aes&>=&H400) AND rsc_mtsk!
  14731.       IF ap_id&=MENU_BAR(rsc_adr%,-1)
  14732.         ~MENU_BAR(rsc_adr%,1)      ! ...Menu nur neu anzeigen, wenn erlaubt
  14733.       ENDIF
  14734.     ELSE                           ! Unter SingleTOS...
  14735.       ~MENU_BAR(rsc_adr%,1)        ! ...Menu immer neu anzeigen
  14736.     ENDIF
  14737.     '
  14738.   ENDIF
  14739.   '
  14740. RETURN
  14741. '
  14742. > FUNCTION rsc_do(tree&,next_obj&,VAR popup&)
  14743.   $F%
  14744.   LOCAL a&,handle&,a$
  14745.   LOCAL edit_obj&,cont&,ob_tail&,obj&,idx&,flags&,rsc_adr%,keytab%
  14746.   LOCAL ascii|,scan|,evnt&,mx&,my&,mb&,mc&,shift&,key&
  14747.   '
  14748.   ' Dialog auswerten...
  14749.   '
  14750.   IF rsc_handle%(tree&)>1000                             ! Normaler Dialog...
  14751.     ~WIND_UPDATE(1)                                      ! ...BEG_UPDATE
  14752.     ~WIND_UPDATE(3)                                      ! ...BEG_MCTRL
  14753.     flags&=&X11                                          ! ...BUTTON/KEYBD-Events
  14754.     '
  14755.   ELSE                                                   ! Fenster-Dialog...
  14756.     flags&=&X10011                                       ! ...zus. MESSAGE-Events
  14757.   ENDIF
  14758.   '
  14759.   rsc_adr%=rsc_adr%(tree&)
  14760.   cont&=TRUE
  14761.   ' ------------------------------------------------------ Editierbares Objekt
  14762.   DO WHILE (NOT BTST(OB_FLAGS(rsc_adr%,next_obj&),3)) OR BTST(OB_STATE(rsc_adr%,next_obj&),3)
  14763.     INC next_obj&
  14764.   LOOP UNTIL BTST(OB_FLAGS(rsc_adr%,next_obj&),5)
  14765.   IF BTST(OB_FLAGS(rsc_adr%,next_obj&),5) AND (NOT BTST(OB_FLAGS(rsc_adr%,next_obj&),3))
  14766.     next_obj&=0
  14767.   ENDIF
  14768.   ' ------------------------------------------------------
  14769.   WHILE cont&
  14770.     '
  14771.     IF next_obj&<>0 AND edit_obj&<>next_obj&             ! Ggf. Cursor setzen...
  14772.       edit_obj&=next_obj&                                ! ...Exit-Code zurück
  14773.       next_obj&=0                                        ! ...'rsc_do' verlassen
  14774.       ~OBJC_EDIT(rsc_adr%,edit_obj&,0,idx&,1,idx&)       ! ...Cursor ein
  14775.     ENDIF
  14776.     '
  14777.     evnt&=EVNT_MULTI(flags&,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,mx&,my&,mb&,shift&,key&,mc&)
  14778.     ' ---------------------------------------------------- Message-Ereignis
  14779.     IF BTST(evnt&,4)
  14780.       handle&=MENU(4)                                    ! ...Fenster-Handle
  14781.       '
  14782.       FOR a&=rsc_trees& DOWNTO 0                         ! Ist es ein RSC?...
  14783.         EXIT IF handle&=rsc_handle%(a&)
  14784.       NEXT a&
  14785.       '
  14786.       IF MENU(1)=41 OR (MENU(1)=22 AND tree&=a&)         ! AC_CLOSE/Closer...
  14787.         MUL rsc_window&,-(MENU(1)=22)
  14788.         next_obj&=rsc_ac_close&                          ! ...Exit-Code
  14789.         GOTO rsc_do_ende                                 ! ...rsc_do verlassen
  14790.         '
  14791.       ELSE IF a&>-1 AND NOT (MENU(1)=21 AND a&<>tree&)   ! Ein RSC-Fenster....
  14792.         rsc_message(a&,MENU(1),MENU(5),MENU(6),MENU(7),MENU(8),edit_obj&,idx&)
  14793.         '
  14794.       ELSE IF MENU(1)=40 OR MENU(1)=21                   ! AC_OPEN/Anderes Fenster toppen...
  14795.         rsc_message(tree&,21,MENU(5),MENU(6),MENU(7),MENU(8),edit_obj&,idx&)
  14796.         '
  14797.       ELSE IF MENU(1)<>21 AND MENU(1)<>22                ! nicht toppen/schließen...
  14798.         window_event !  message_auswerten(MENU(1),MENU(2),MENU(3),MENU(4),MENU(5),MENU(6),MENU(7),MENU(8))
  14799.       ELSE                                               ! Nichts zu machen...
  14800.         ~BIOS(3,2,7)
  14801.       ENDIF
  14802.     ENDIF
  14803.     ' ---------------------------------------------------- Tastaturereignis
  14804.     IF BTST(evnt&,0)
  14805.       '
  14806.       '      cont&=FORM_KEYBD(rsc_adr%,edit_obj&,key&,0,next_obj&,key&)
  14807.       ' Möchten Sie erweiterte Tastaturkommandos? Dann entREMen Sie
  14808.       ' diese Zeile und ersetzen die Prozedur durch:
  14809.       cont&=@form_keybd(rsc_adr%,edit_obj&,key&,0,next_obj&,key&,idx&)
  14810.       '
  14811.       ascii|=BYTE(key&)                                  ! ASCII-Code
  14812.       scan|=BYTE(SHR(key&,8))                            ! SCAN-Code
  14813.       '
  14814.       IF ascii|=0                                        ! Kein ASCII-Code...
  14815.         '
  14816.         IF scan|=97 OR scan|=98                          ! UNDO/HELP...
  14817.           ascii|=ADD(SUB(scan|,97),14)
  14818.           obj&=0
  14819.           DO WHILE BTST(OB_FLAGS(rsc_adr%,obj&),5)=FALSE
  14820.             INC obj&
  14821.           LOOP UNTIL BTST(OB_FLAGS(rsc_adr%,obj&),ascii|)
  14822.           IF BTST(OB_FLAGS(rsc_adr%,obj&),ascii|)
  14823.             cont&=FORM_BUTTON(rsc_adr%,obj&,1,next_obj&)
  14824.           ENDIF
  14825.           '
  14826.         ELSE IF scan|>=59 AND scan|<=68                  ! F-Tasten...
  14827.           ascii|=SUB(scan|,58)
  14828.           obj&=0
  14829.           DO WHILE BTST(OB_FLAGS(rsc_adr%,obj&),5)=FALSE
  14830.             INC obj&
  14831.           LOOP UNTIL SHR&(OB_STATE(rsc_adr%,obj&),12)=ascii|
  14832.           IF SHR&(OB_STATE(rsc_adr%,obj&),12)=ascii|
  14833.             cont&=FORM_BUTTON(rsc_adr%,obj&,1,next_obj&)
  14834.           ENDIF
  14835.           '
  14836.         ELSE                                             ! ALT+Buchstabe...
  14837.           '
  14838.           IF scan|>=120 AND scan|<=129                   ! Zahlen...
  14839.             SUB scan|,118
  14840.             keytab%={XBIOS(16,L:-1,L:-1,L:-1)}           ! ...ohne Shift
  14841.           ELSE                                           ! Alles andere...
  14842.             keytab%={ADD(XBIOS(16,L:-1,L:-1,L:-1),4)}    ! ...mit Shift
  14843.           ENDIF
  14844.           '
  14845.           ascii|=BYTE{ADD(keytab%,scan|)}                ! ASCII-Code holen
  14846.           '
  14847.           IF ascii|                                      ! Tastaturbedienbar...
  14848.             CLR a&,obj&
  14849.             '
  14850.             DO WHILE NOT BTST(OB_FLAGS(rsc_adr%,obj&),5) ! Nicht LASTOBJ
  14851.               INC obj&
  14852.               '
  14853.               scan|=BYTE(SHR(OB_TYPE(rsc_adr%,obj&),8))
  14854.               IF scan|=26 OR scan|=28                    ! Ein Button/String...
  14855.                 a$=@rsc_text$(tree&,obj&)                ! ...Text
  14856.                 '
  14857.                 a&=INSTR(a$,"[")
  14858.                 IF a&                                    ! Tastaturbedienbar...
  14859.                   a&=ASC(MID$(a$,SUCC(a&),1))
  14860.                   a&=(BCLR(a&,5)=ascii|) OR (a&>=48 AND a&<=57 AND a&=ascii|)
  14861.                 ENDIF
  14862.                 '                                        ! '[' vor Zeichen
  14863.               ENDIF
  14864.               '
  14865.             LOOP UNTIL a&                                ! ...gefunden
  14866.             '
  14867.             IF a&                                        ! Objekt gefunden...
  14868.               key&=0                                     ! ...keine Eingabe mehr
  14869.               '                                          ! +SHIFT Circle-Butt?
  14870.               IF BTST(shift&,1) AND BTST(OB_FLAGS(rsc_adr%,obj&),6) AND BTST(OB_STATE(rsc_adr%,SUCC(obj&)),5) AND SHR(OB_TYPE(rsc_adr%,obj&+2),8)=27
  14871.                 evnt&=BSET(evnt&,1)
  14872.                 mb&=1                                    ! ...Mausklick simulieren
  14873.                 ~OBJC_OFFSET(rsc_adr%,obj&+2,mx&,my&)
  14874.                 '                                        ! Ist es ein Popup...
  14875.               ELSE IF BTST(OB_FLAGS(rsc_adr%,obj&),6) AND BTST(OB_STATE(rsc_adr%,SUCC(obj&)),5)
  14876.                 evnt&=BSET(evnt&,1)
  14877.                 mb&=1                                    ! ...Mausklick simul.
  14878.                 ~OBJC_OFFSET(rsc_adr%,obj&,mx&,my&)
  14879.                 '
  14880.               ELSE                                       ! ...Button bedienen
  14881.                 cont&=FORM_BUTTON(rsc_adr%,obj&,1,next_obj&)
  14882.               ENDIF
  14883.             ENDIF
  14884.             '
  14885.           ENDIF
  14886.         ENDIF
  14887.         '
  14888.       ENDIF
  14889.       '
  14890.       IF key&
  14891.         ~OBJC_EDIT(rsc_adr%,edit_obj&,key&,idx&,2,idx&)  ! ...Eingabe
  14892.       ENDIF
  14893.       '
  14894.     ENDIF
  14895.     ' ---------------------------------------------------- Mausereignis
  14896.     IF BTST(evnt&,1) AND mb&=1
  14897.       '                                                  ! Objekt unter Maus..
  14898.       next_obj&=OBJC_FIND(rsc_adr%,0,100,mx&,my&)
  14899.       '                                                  ! String vor Popup...
  14900.       IF next_obj&>0
  14901.         IF BTST(OB_FLAGS(rsc_adr%,next_obj&),6) AND SHR(OB_TYPE(rsc_adr%,next_obj&),8)=28 AND BTST(OB_STATE(rsc_adr%,SUCC(next_obj&)),5)
  14902.           ' (TOUCHEXIT, STRING, SUCC: SHADOWED)
  14903.           INC next_obj&
  14904.         ENDIF
  14905.       ENDIF
  14906.       '
  14907.       IF next_obj&=-1                                    ! Neben die Box...
  14908.         ~BIOS(3,2,7)                                     ! ...PING!
  14909.         next_obj&=0
  14910.         '
  14911.       ELSE
  14912.         cont&=FORM_BUTTON(rsc_adr%,next_obj&,1,next_obj&)
  14913.         ' ------------------------------------------------ Flydial-Ecke
  14914.         IF BTST(OB_STATE(rsc_adr%,next_obj&),1)          ! (CROSSED)
  14915.           rsc_movedial(tree&,edit_obj&,idx&)             ! ...Dialog verschieben
  14916.           '
  14917.           next_obj&=0                                    ! Damit der Cursor..
  14918.           cont&=1                                        ! ..bleibt wo er ist
  14919.           ' ---------------------------------------------- Circle-Button...
  14920.         ELSE IF SHR(OB_TYPE(rsc_adr%,next_obj&),8)=27 AND BTST(OB_STATE(rsc_adr%,MAX(0,PRED(next_obj&))),5) AND (NOT BTST(OB_STATE(rsc_adr%,MAX(0,PRED(next_obj&))),3))
  14921.           ' (G_BOXCHAR, PRED: SHADOWED /NOT DISABLED)
  14922.           next_obj&=PRED(next_obj&)                      ! Objektnr. Button
  14923.           a$=@rsc_text$(tree&,next_obj&)                 ! Text des Buttons
  14924.           evnt&=SHR&(OB_TYPE(rsc_adr%,next_obj&),8)-30   ! Nr. des Popup-Baumes
  14925.           '
  14926.           obj&=1
  14927.           FOR ob_tail&=1 TO PRED(evnt&)
  14928.             obj&=OB_NEXT(rsc_adr%(rsc_popup&),obj&)      ! Objektnr. des Popups
  14929.           NEXT ob_tail&
  14930.           '
  14931.           evnt&=SUCC(obj&)
  14932.           DO WHILE a$<>@rsc_text$(rsc_popup&,evnt&)
  14933.             INC evnt&                                    ! Defaulteintrag
  14934.           LOOP
  14935.           '
  14936.           REPEAT
  14937.             INC evnt&                                    ! Nächster Eintrag...
  14938.             IF evnt&>OB_TAIL(rsc_adr%(rsc_popup&),obj&)  ! ...gibt es nicht
  14939.               evnt&=SUCC(obj&)                           ! ...dann wieder 1.
  14940.             ENDIF
  14941.             '                                            ! bis nicht DISABLED
  14942.           UNTIL NOT BTST(OB_STATE(rsc_adr%(rsc_popup&),evnt&),3)
  14943.           '                                              ! Button ändern...
  14944.           rsc_text(tree&,next_obj&,@rsc_text$(rsc_popup&,evnt&))
  14945.           ~OBJC_DRAW(rsc_adr%,next_obj&,1,rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  14946.           popup&=SUB(evnt&,obj&)
  14947.           ' ---------------------------------------------- Popup-Menue...
  14948.         ELSE IF BTST(OB_STATE(rsc_adr%,next_obj&),5) AND BTST(OB_FLAGS(rsc_adr%,next_obj&),6) AND (NOT BTST(OB_STATE(rsc_adr%,next_obj&),3))
  14949.           ' (SHADOWED, TOUCHEXIT, NOT DISABLED)
  14950.           evnt&=SHR&(OB_TYPE(rsc_adr%,next_obj&),8)-30   ! Nr. des Popup-Baumes
  14951.           obj&=1
  14952.           FOR ob_tail&=1 TO PRED(evnt&)
  14953.             obj&=OB_NEXT(rsc_adr%(rsc_popup&),obj&)      ! Objektnr. des Popups
  14954.           NEXT ob_tail&
  14955.           '
  14956.           ob_tail&=OB_TAIL(rsc_adr%(rsc_popup&),obj&)
  14957.           a$=@rsc_text$(tree&,next_obj&)                 ! Text des Buttons
  14958.           '
  14959.           evnt&=SUCC(obj&)
  14960.           DO WHILE a$<>@rsc_text$(rsc_popup&,evnt&)
  14961.             INC evnt&                                    ! Ausrichtung ermitteln
  14962.           LOOP UNTIL evnt&>ob_tail&
  14963.           '
  14964.           IF evnt&<=ob_tail&                             ! Defaulteintrag...
  14965.             popup&=@rsc_popup(TRUE,tree&,next_obj&,obj&,SUB(evnt&,SUCC(obj&)))
  14966.           ELSE                                           ! Sonst ohne...
  14967.             popup&=@rsc_popup(FALSE,tree&,next_obj&,obj&,1)
  14968.           ENDIF
  14969.           '
  14970.           IF popup&=0                                    ! Abbruch...
  14971.             cont&=1                                      ! ...weiter geht's
  14972.             next_obj&=0                                  ! ...Cursor 'festhalten'
  14973.           ENDIF
  14974.           ' ---------------------------------------------- Cursor positionieren
  14975.           ' Möchten Sie den Cursor mit der Maus zeichengenau positionieren?
  14976.           ' Dann entREMen Sie diese 2 Zeilen und laden diese Prozedur nach:
  14977.         ELSE IF BTST(OB_FLAGS(rsc_adr%,next_obj&),3)
  14978.           rsc_set_cursor(rsc_adr%,mx&,my&,edit_obj&,next_obj&,idx&)
  14979.         ENDIF
  14980.         '
  14981.       ENDIF
  14982.     ENDIF
  14983.     '
  14984.     IF cont&=0 OR (next_obj&<>0 AND next_obj&<>edit_obj&)
  14985.       ~OBJC_EDIT(rsc_adr%,edit_obj&,0,idx&,3,idx&)       ! Ggf. Cursor aus
  14986.     ENDIF
  14987.     '
  14988.   WEND
  14989.   '
  14990.   IF rsc_handle%(tree&)>1000                             ! Normaler Dialog...
  14991.     ~WIND_UPDATE(0)                                      ! END_UPDATE
  14992.     ~WIND_UPDATE(2)                                      ! END_MCTRL
  14993.   ENDIF
  14994.   '
  14995.   IF mc&=2 AND BTST(OB_FLAGS(rsc_adr%,next_obj&),6)      ! Doppelklick auf
  14996.     next_obj&=WORD(BSET(next_obj&,15))                   ! TOUCHEXIT...
  14997.   ENDIF                                                  ! ...15. Bit setzen
  14998.   '
  14999. rsc_do_ende:
  15000.   RETURN next_obj&
  15001. ENDFUNC
  15002. > FUNCTION rsc_popup(a!,tree&,button&,popup&,def&)
  15003.   $F%
  15004.   LOCAL x&,y&,b&,h&,m!
  15005.   LOCAL evnt&,mx&,my&,mb&,shift&,key&,mc&,ascii|,scan|
  15006.   LOCAL obj&,old_obj&,first&,anz&
  15007.   LOCAL rsc&,rsc_adr%
  15008.   '
  15009.   ' Popup-Menü darstellen und auswerten...
  15010.   '
  15011.   ' a!       : TRUE: Button verändern, FALSE: Nur Popup
  15012.   ' tree&    : Index des Dialogbaumes
  15013.   ' button&  : Objektnr. des betätigten Buttons
  15014.   ' popup&   : Index des Popups
  15015.   ' def&     : Default-Eintrag (1-x)
  15016.   '
  15017.   ~WIND_UPDATE(1)                                   ! BEG_UPDATE
  15018.   ~WIND_UPDATE(3)                                   ! BEG_MCTRL
  15019.   '
  15020.   rsc_adr%=rsc_adr%(rsc_popup&)
  15021.   '
  15022.   first&=OB_HEAD(rsc_adr%,popup&)                   ! erster Eintrag
  15023.   anz&=SUB(OB_TAIL(rsc_adr%,popup&),first&)         ! Anzahl Einträge-1
  15024.   ' ------------------------------------------------- Popup positionieren
  15025.   ~OBJC_OFFSET(rsc_adr%(tree&),button&,x&,y&)
  15026.   OB_X(rsc_adr%,0)=SUB(x&,OB_X(rsc_adr%,popup&))
  15027.   OB_Y(rsc_adr%,0)=MAX(ADD(hchar&,4),MIN(SUB(WORK_OUT(1),4)-OB_H(rsc_adr%,popup&),SUB(y&,MUL(def&,hchar&))))-OB_Y(rsc_adr%,popup&)
  15028.   '
  15029.   x&=ADD(OB_X(rsc_adr%,0),PRED(OB_X(rsc_adr%,popup&)))
  15030.   y&=ADD(OB_Y(rsc_adr%,0),PRED(OB_Y(rsc_adr%,popup&)))
  15031.   b&=ADD(OB_W(rsc_adr%,popup&),4)
  15032.   h&=ADD(OB_H(rsc_adr%,popup&),4)
  15033.   ' -------------------------------------------------
  15034.   rsc_bitblt(0,0,0,popup_back%,b&,h&,x&,y&,b&,h&,0,0)
  15035.   '
  15036.   ~OBJC_DRAW(rsc_adr%,0,7,x&,y&,b&,h&)              ! Popup zeichnen
  15037.   '
  15038.   IF a!                                             ! Button verändern...
  15039.     '
  15040.     ~GRAF_MOUSE(256,0)                              ! Hidem
  15041.     V~H=rsc_vh&                                     ! ...Default-Eintrag mit...
  15042.     GRAPHMODE 2
  15043.     '
  15044.     INTIN(0)=8                                      ! ...Häkchen versehen
  15045.     PTSIN(0)=ADD(x&,DIV(wchar&,2))
  15046.     PTSIN(1)=y&-DIV(hchar&,6)+MUL(SUCC(def&),hchar&)
  15047.     VDISYS 8,1,1                                    ! ...v_gtext()
  15048.     '
  15049.     GRAPHMODE 1
  15050.     V~H=-1
  15051.     ~GRAF_MOUSE(257,0)                              ! Showm
  15052.     '
  15053.   ENDIF
  15054.   '
  15055.   ~GRAF_MKSTATE(mx&,my&,mb&,shift&)
  15056.   '
  15057.   obj&=OBJC_FIND(rsc_adr%,popup&,anz&,mx&,my&)      ! Objekt unter der Maus...
  15058.   '
  15059.   IF obj&<=0                                        ! Daneben...
  15060.     obj&=ADD(first&,def&)                           ! ...Default-Eintrag nehmen
  15061.   ENDIF
  15062.   '
  15063.   old_obj&=obj&
  15064.   IF (NOT BTST(OB_STATE(rsc_adr%,MAX(0,obj&)),3))   ! Nicht disabled...
  15065.     ~OBJC_CHANGE(rsc_adr%,obj&,0,x&,y&,b&,h&,1,1)   ! ...selektieren
  15066.   ENDIF
  15067.   '
  15068.   ~EVNT_TIMER(200)
  15069.   ~GRAF_MKSTATE(mx&,my&,mb&,shift&)
  15070.   '
  15071.   IF mb&=1
  15072.     m!=TRUE
  15073.     evnt&=4
  15074.   ENDIF
  15075.   '
  15076.   ' --------------------------------------------------
  15077.   DO
  15078.     '
  15079.     IF NOT m!
  15080.       evnt&=EVNT_MULTI(&X111,1,1,1,1,mx&,my&,1,1,0,0,0,0,0,0,0,mx&,my&,mb&,shift&,key&,mc&)
  15081.     ELSE
  15082.       ~GRAF_MKSTATE(mx&,my&,mb&,shift&)
  15083.     ENDIF
  15084.     '
  15085.     IF BTST(evnt&,0)                                 ! Tastaturereignis...
  15086.       ascii|=BYTE(key&)
  15087.       scan|=BYTE(SHR(key&,8))
  15088.       '                                              ! Noch kein sel. Eintrag...
  15089.       IF NOT (obj&>=first& AND obj&<=ADD(first&,anz&))
  15090.         obj&=first&
  15091.         '
  15092.       ELSE IF scan|=80                               ! ...Cursor runter
  15093.         INC obj&
  15094.         IF obj&>ADD(first&,anz&)
  15095.           obj&=first&
  15096.         ENDIF
  15097.         '
  15098.       ELSE IF scan|=72                               ! ...Cursor runter
  15099.         DEC obj&
  15100.         IF obj&<first&
  15101.           obj&=ADD(first&,anz&)
  15102.         ENDIF
  15103.         '
  15104.       ENDIF
  15105.       '
  15106.     ENDIF
  15107.     '
  15108.     IF BTST(evnt&,2)                                 ! Mausereignis...
  15109.       obj&=OBJC_FIND(rsc_adr%,popup&,anz&,mx&,my&)
  15110.     ENDIF
  15111.     '                                                ! Alten Eintrag deselekt...
  15112.     IF obj&<>old_obj&
  15113.       ~OBJC_CHANGE(rsc_adr%,old_obj&,0,x&,y&,b&,h&,BCLR(OB_STATE(rsc_adr%,old_obj&),0),1)
  15114.     ENDIF
  15115.     '                                                ! Im Menü und nicht disabled...
  15116.     IF (obj&>=first& AND obj&<=ADD(first&,anz&)) AND (NOT BTST(OB_STATE(rsc_adr%,MAX(0,obj&)),3))
  15117.       ~OBJC_CHANGE(rsc_adr%,obj&,0,x&,y&,b&,h&,1,1)  ! ...neuen selektieren
  15118.       '
  15119.       old_obj&=obj&
  15120.       rsc&=SUB(obj&,first&)                          ! Rückgabe
  15121.     ENDIF
  15122.     '
  15123.   LOOP UNTIL BTST(evnt&,1) OR (mb&<>1 AND m!) OR ascii|=13 OR ascii|=27 OR scan|=97
  15124.   ' --------------------------------------------------
  15125.   rsc_bitblt(popup_back%,b&,h&,0,0,0,0,0,b&,h&,x&,y&)! Hintergrund restaurieren
  15126.   '
  15127.   IF rsc&=SUB(obj&,first&) AND scan|<>97 AND ascii|<>27 ! Eintrag ausgewählt...
  15128.     '
  15129.     ~OBJC_CHANGE(rsc_adr%,obj&,0,x&,y&,b&,h&,BCLR(OB_STATE(rsc_adr%,obj&),0),0)
  15130.     '
  15131.     IF a!                                            ! Button verändern...
  15132.       '                                              ! Neuen Text eintragen:
  15133.       rsc_text(tree&,button&,@rsc_text$(rsc_popup&,obj&))
  15134.       '
  15135.       ~OBJC_OFFSET(rsc_adr%(tree&),button&,x&,y&)    ! Button zeichnen
  15136.       ~OBJC_DRAW(rsc_adr%(tree&),button&,1,x&,y&,OB_W(rsc_adr%(tree&),button&),OB_H(rsc_adr%(tree&),button&))
  15137.       '
  15138.     ENDIF
  15139.     '
  15140.   ELSE                                               ! Daneben => Abbruch...
  15141.     ~OBJC_CHANGE(rsc_adr%,old_obj&,0,x&,y&,b&,h&,BCLR(OB_STATE(rsc_adr%,old_obj&),0),0)
  15142.     '
  15143.     rsc&=-1                                          ! ...Abbruch markieren
  15144.     '
  15145.   ENDIF
  15146.   '
  15147.   REPEAT
  15148.     ~GRAF_MKSTATE(mx&,my&,mb&,shift&)                ! Mausknopf 'entprellen'
  15149.   UNTIL mb&=0
  15150.   '
  15151.   ~WIND_UPDATE(2)                                    ! END_MCTRL
  15152.   ~WIND_UPDATE(0)                                    ! END_UPDATE
  15153.   '
  15154.   RETURN SUCC(rsc&)
  15155. ENDFUNC
  15156. '
  15157. > PROCEDURE rsc_message(tree&,message&,x&,y&,w&,h&,edit_obj&,idx&)
  15158.   LOCAL a|,ax&,ay&,ab&,ah&,handle&,obj&,rsc_adr%,a%,a$
  15159.   '
  15160.   ' Wertet ein innerhalb des 'rsc_do' eingetroffenes Message-Ereignis aus...
  15161.   '
  15162.   handle&=rsc_handle%(tree&)                         ! Fensterhandle des Dialogs
  15163.   '
  15164.   ~WIND_UPDATE(1)                                    ! BEG_UPDATE
  15165.   '
  15166.   SELECT message&
  15167.     ' --------------------------------------------------------------------------
  15168.   CASE 20,21                                         ! WM_REDRAW/WM_TOPPED
  15169.     IF message&=20                                   ! WM_REDRAW...
  15170.       ' ~GRAF_MOUSE(256,0)                           ! Hidem
  15171.       ~WIND_GET(handle&,11,ax&,ay&,ab&,ah&)          ! 1. Rechteck
  15172.       '
  15173.       REPEAT
  15174.         '
  15175.         IF RC_INTERSECT(x&,y&,w&,h&,ax&,ay&,ab&,ah&) ! ...redrawen
  15176.           ~OBJC_DRAW(rsc_adr%(tree&),0,11,ax&,ay&,ab&,ah&)
  15177.         ENDIF
  15178.         '
  15179.         ~WIND_GET(handle&,12,ax&,ay&,ab&,ah&)        ! Nächstes Rechteck...
  15180.       UNTIL ab&=0 AND ah&=0                          ! ...kein Redraw mehr nötig
  15181.       '
  15182.       ' ~GRAF_MOUSE(257,0)                           ! Showm
  15183.       '
  15184.     ELSE                                             ! WM_TOPPED...
  15185.       ~WIND_SET(handle&,10,0,0,0,0)                  ! ...toppen
  15186.     ENDIF
  15187.     '
  15188.     ~WIND_GET(0,10,ax&,ay&,ay&,ay&)                  ! Oberstes Fenster...
  15189.     IF ax&=handle& AND edit_obj&>0                   ! Ist das unsrige...
  15190.       ' ---------------------------------------------- Cursor-Setz-Orgie...
  15191.       rsc_adr%=rsc_adr%(tree&)
  15192.       '
  15193.       obj&=edit_obj&                                 ! Parent ermitteln...
  15194.       '
  15195.       REPEAT
  15196.         obj&=OB_NEXT(rsc_adr%,obj&)
  15197.       UNTIL obj&<edit_obj&
  15198.       '
  15199.       ~OBJC_OFFSET(rsc_adr%,edit_obj&,ax&,ay&)       ! Koordinaten des Objekts
  15200.       '
  15201.       a$=CHAR{{ADD(OB_SPEC(rsc_adr%,edit_obj&),4)}}  ! Maske: "Eingabe:______"
  15202.       ah&=1
  15203.       WHILE MID$(a$,ah&,1)<>"_"                      ! Länge des Vortextes...
  15204.         INC ah&
  15205.       WEND                                           ! ...ermitteln
  15206.       '
  15207.       ADD ax&,MUL(wchar&,ADD(PRED(ah&),idx&))        ! Cursor-Position im Pixeln
  15208.       ah&=ADD(OB_H(rsc_adr%,edit_obj&),6)            ! Cursor ist größer hchar&
  15209.       '                                              ! Cursor löschen...
  15210.       ~OBJC_DRAW(rsc_adr%,obj&,10,ax&,SUB(ay&,3),wchar&,ah&)
  15211.       rsc_cursor(rsc_adr%,edit_obj&,idx&)            ! ...und setzen
  15212.       '
  15213.     ENDIF
  15214.     ' --------------------------------------------------------------------------
  15215.   CASE 28                                            ! WM_MOVED
  15216.     ~WIND_CALC(1,&X1001,x&,y&,w&,h&,ax&,ay&,ab&,ah&)
  15217.     '
  15218.     rscx&(tree&)=PRED(ax&)
  15219.     rscy&(tree&)=SUB(SUB(ay&,5),MUL(hchar&,2))
  15220.     OB_X(rsc_adr%(tree&),0)=ADD(rscx&(tree&),3)
  15221.     OB_Y(rsc_adr%(tree&),0)=ADD(rscy&(tree&),3)
  15222.     '
  15223.     ~WIND_SET(handle&,5,x&,y&,w&,h&)
  15224.     '
  15225.   ENDSELECT
  15226.   '
  15227.   ~WIND_UPDATE(0)                                    ! END_UPDATE
  15228.   '
  15229. RETURN
  15230. '
  15231. > PROCEDURE rsc_back(tree&)
  15232.   '
  15233.   ' Entfernt den Dialog vom Bildschirm...
  15234.   '
  15235.   ' ---------------------------------------------------- Als Fenster-Dialog
  15236.   IF rsc_handle%(tree&)>0 AND rsc_handle%(tree&)<1000
  15237.     '
  15238.     ~WIND_UPDATE(1)                                    ! BEG_UPDATE
  15239.     '
  15240.     rsc_menu_ienable(TRUE)                             ! ...Menü wieder wählbar
  15241.     '
  15242.     IF rsc_window&                                     ! Fenster existiert...
  15243.       '
  15244.       ~WIND_CLOSE(rsc_handle%(tree&))
  15245.       ~WIND_DELETE(rsc_handle%(tree&))                 ! ...schließen & abmelden
  15246.       '
  15247.       DEC rsc_window&                                  ! Anz. offene Fenster-1
  15248.       '
  15249.     ELSE                                               ! Sonst Redraw auslösen...
  15250.       ~FORM_DIAL(3,0,0,0,0,rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  15251.     ENDIF
  15252.     ' -------------------------------------------------- Als normaler Dialog
  15253.   ELSE
  15254.     rsc_list$=LEFT$(rsc_list$,SUB(LEN(rsc_list$),2))   ! Dialog aus der Liste entf.
  15255.     '
  15256.     IF rsc_handle%(tree&)                              ! Hintergrund gerettet...
  15257.       rsc_bitblt(rsc_handle%(tree&),rscw&(tree&),rsch&(tree&),0,0,0,0,0,rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&))
  15258.       ~MFREE(rsc_handle%(tree&))
  15259.       '
  15260.     ELSE                                               ! Desktop redrawen...
  15261.       ~FORM_DIAL(3,0,0,0,0,rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  15262.       IF rsc_list$<>""                                 ! Noch ein Dialog drunter...
  15263.         ~OBJC_DRAW(rsc_adr%(CVI(RIGHT$(rsc_list$,2))),0,100,rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  15264.       ENDIF                                            ! ...diesen auch redrawen
  15265.     ENDIF
  15266.   ENDIF
  15267.   '
  15268.   rsc_handle%(tree&)=0
  15269.   '
  15270.   ~WIND_UPDATE(0)                                      ! END_UPDATE
  15271.   '
  15272. RETURN
  15273. '
  15274. > PROCEDURE rsc_text(tree&,obj&,a$)
  15275.   '
  15276.   ' Universelle Objekt-Text Belegung...
  15277.   '
  15278.   CHAR{C:rsc_obspec%(L:rsc_adr%(tree&),obj&)}=a$
  15279. RETURN
  15280. > PROCEDURE rsc_bitblt(a%,w&,h&,b%,rb&,rh&,ax&,ay&,ab&,ah&,gx&,gy&)
  15281.   '
  15282.   ' Universeller Raster-Kopierer (benutzt vro_cpyfm oder vrt_cpyfm)...
  15283.   '
  15284.   IF ab&>0 AND ah&>0                 ! Breite und Höhe vorhanden...
  15285.     '
  15286.     ~GRAF_MOUSE(256,0)               ! Hidem
  15287.     ~C:rsc_bitblt%(L:a%,w&,h&,0,planes&,L:b%,rb&,rh&,0,planes&,ax&,ay&,ab&,ah&,gx&,gy&,1)
  15288.     ~GRAF_MOUSE(257,0)               ! Showm
  15289.     '
  15290.   ENDIF
  15291.   '
  15292. RETURN
  15293. > PROCEDURE rsc_cursor(rsc_adr%,edit_obj&,idx&)
  15294.   LOCAL a|,a%
  15295.   '
  15296.   ' Zeichengenaue Positionierung des Cursors...
  15297.   '
  15298.   a%=ADD({OB_SPEC(rsc_adr%,edit_obj&)},idx&)
  15299.   '
  15300.   a|=BYTE{a%}                                        ! Zeichen merken
  15301.   BYTE{a%}=0                                         ! ...und durch 0 ersetzen
  15302.   '
  15303.   ~OBJC_EDIT(rsc_adr%,edit_obj&,0,idx&,1,idx&)       ! Cursor setzen
  15304.   BYTE{a%}=a|                                        ! ...Zeichen restaurieren
  15305.   '
  15306. RETURN
  15307. ' ------------------------------------------------------------------------------
  15308. ' -                        ERGO-TOOLS für GFA-BASIC 3.x                        -
  15309. ' -            Vertrieb: Columbus Soft, Kinzigweg 1, 64297 Darmstadt           -
  15310. ' ------------------------------------------------------------------------------
  15311. ' - 'Fliegende Dialoge' für GFA-BASIC 3.x                                      -
  15312. ' - Bibliothek für zusätzliche Routinen, Beschreibung in EXTENDED.TXT          -
  15313. ' - von Gregor Duchalski, letzte Änderung 28.02.94                             -
  15314. ' ------------------------------------------------------------------------------
  15315. ' Zusätzliche Tastaturkommandos...
  15316. ' Einfach FORM_KEYBD in 'rsc_do' durch @form_keybd ersetzen.
  15317. '
  15318. > FUNCTION form_keybd(rsc_adr%,edit_obj&,key&,a&,VAR next_obj&,key_back&,idx&)
  15319.   $F%
  15320.   LOCAL scan|,cont&
  15321.   '
  15322.   ' Ersetzt FORM_KEYBD()...
  15323.   '
  15324.   key_back&=0
  15325.   cont&=1
  15326.   '
  15327.   SELECT key&
  15328.     '
  15329.     ' ------------------------------------------------- SHIFT right
  15330.   CASE &H4D36
  15331.     ~OBJC_EDIT(rsc_adr%,edit_obj&,0,idx&,3,idx&)
  15332.     ~OBJC_EDIT(rsc_adr%,edit_obj&,0,idx&,1,idx&)
  15333.     ' ------------------------------------------------- SHIFT left
  15334.   CASE &H4B34
  15335.     '
  15336.     ~OBJC_EDIT(rsc_adr%,edit_obj&,0,idx&,3,idx&)
  15337.     '
  15338.     a&=BYTE{{OB_SPEC(rsc_adr%,edit_obj&)}}
  15339.     BYTE{{OB_SPEC(rsc_adr%,edit_obj&)}}=0
  15340.     '
  15341.     ~OBJC_EDIT(rsc_adr%,edit_obj&,0,idx&,1,idx&)
  15342.     BYTE{{OB_SPEC(rsc_adr%,edit_obj&)}}=a&
  15343.     '
  15344.     ' ------------------------------------------------- Cursor runter
  15345.   CASE &H5000
  15346.     next_obj&=@form_search_flag(rsc_adr%,edit_obj&,3,1)
  15347.     ' ------------------------------------------------- Cursor rauf
  15348.   CASE &H4800
  15349.     next_obj&=@form_search_flag(rsc_adr%,edit_obj&,3,-1)
  15350.     ' ------------------------------------------------- SHIFT runter/HOME
  15351.   CASE &H5032,&H4737                                  ! =>letztes Feld
  15352.     REPEAT
  15353.       next_obj&=edit_obj&
  15354.       edit_obj&=@form_search_flag(rsc_adr%,edit_obj&,3,1)
  15355.     UNTIL edit_obj&=0
  15356.     ' ------------------------------------------------- SHIFT rauf, HOME
  15357.   CASE &H4838,&H4700                                  ! =>erstes Feld
  15358.     next_obj&=@form_search_flag(rsc_adr%,0,3,1)
  15359.     ' ------------------------------------------------- HELP/UNDO
  15360.   CASE &H6200,&H6100
  15361.     key_back&=key&
  15362.     ' ------------------------------------------------- Alles andere
  15363.   DEFAULT
  15364.     scan|=BYTE(SHR(key&,8))                           ! SCAN-Code
  15365.     '
  15366.     IF BYTE(key&)>0 OR scan|=75 OR scan|=77           ! Cursor rauf/runter
  15367.       cont&=FORM_KEYBD(rsc_adr%,edit_obj&,key&,0,next_obj&,key&)
  15368.       '                                               ! Kein Ende&TAB u. EDITABLE
  15369.       IF cont&>0 AND BYTE(key&)<>9 AND BTST(OB_FLAGS(rsc_adr%,edit_obj&),3)
  15370.         '
  15371.         scan|=BYTE{{OB_SPEC(rsc_adr%,edit_obj&)+8}+idx&}! Maske 'A' oder 'N'...
  15372.         IF scan|=65 OR (scan|=78 AND (BYTE(key&)<48 OR BYTE(key&)>57))
  15373.           key&=BCLR(key&,5)                             ! ...Großschrift setzen
  15374.         ENDIF
  15375.         '
  15376.         ~OBJC_EDIT(rsc_adr%,edit_obj&,key&,idx&,2,idx&) ! ...Eingabe
  15377.       ENDIF
  15378.       '
  15379.     ELSE
  15380.       key_back&=key&
  15381.     ENDIF
  15382.     '
  15383.   ENDSELECT
  15384.   '
  15385.   RETURN cont&
  15386. ENDFUNC
  15387. > FUNCTION form_search_flag(rsc_adr%,obj&,flag&,step&)
  15388.   $F%
  15389.   '
  15390.   ' Unterroutine für form_keybd. Sucht das nächste/vorhergehende Objekt mit
  15391.   ' dem gesetzten Bit 'flag&' in OB_FLAGS...
  15392.   '
  15393.   ' Sonderfall: Letztes Objekt ist edierbar, Cursor runter:
  15394.   IF NOT (BTST(OB_FLAGS(rsc_adr%,obj&),5)=TRUE AND step&>0)
  15395.     '
  15396.     REPEAT
  15397.       ADD obj&,step&
  15398.       '
  15399.       IF BTST(OB_FLAGS(rsc_adr%,obj&),flag&) AND (NOT BTST(OB_STATE(rsc_adr%,obj&),3))
  15400.         RETURN obj&
  15401.       ENDIF
  15402.     UNTIL (obj&<=0) OR BTST(OB_FLAGS(rsc_adr%,obj&),5)
  15403.     '
  15404.   ENDIF
  15405.   '
  15406.   RETURN 0
  15407. ENDFUNC
  15408. ' ------------------------------------------------------------------------------
  15409. ' SOLID Flydials...
  15410. ' Einfach die Prozedur 'rsc_movedial' ersetzen.
  15411. '
  15412. > PROCEDURE rsc_movedial_durchs(tree&,edit_obj&,idx&)  ! DURCHSICHTIG  (Name ändern)
  15413.   LOCAL ghost!,x&,y&,a%
  15414.   '
  15415.   ' Dialogbox bewegen...
  15416.   ' Möchten Sie SOLID-Flydials? Dann ersetzen Sie diese Prozedur
  15417.   ' durch die entsprechenden aus der EXTENDED.LST-Datei.
  15418.   '
  15419.   ~GRAF_MKSTATE(x&,x&,x&,y&)
  15420.   ghost!=AND(y&,&X1111) OR x&=3                            ! Geisterdials...
  15421.   IF ghost!
  15422.     rsc_bitblt(rsc_handle%(tree&),rscw&(tree&),rsch&(tree&),0,0,0,0,0,rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&))
  15423.   ENDIF
  15424.   '
  15425.   ~GRAF_MOUSE(4,0)                                         ! Bewegen...
  15426.   ~GRAF_DRAGBOX(rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&),deskx&,desky&,deskw&,deskh&,x&,y&)
  15427.   ~GRAF_MOUSE(0,0)
  15428.   '
  15429.   IF x&<>rscx&(tree&) OR y&<>rscy&(tree&) OR ghost!        ! Überhaupt bewegt...
  15430.     '
  15431.     IF NOT ghost!
  15432.       a%=MALLOC(@getsize(rscw&(tree&),rsch&(tree&)))       ! Dialog getten
  15433.       IF a%                                                ! ...hat geklappt
  15434.         rsc_bitblt(0,0,0,a%,rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&),0,0)
  15435.       ENDIF
  15436.     ENDIF
  15437.     '                                                      ! Hintergr. restaur.
  15438.     rsc_bitblt(rsc_handle%(tree&),rscw&(tree&),rsch&(tree&),0,0,0,0,0,rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&))
  15439.     '
  15440.     rscx&(tree&)=x&                                        ! Neue Position setzen...
  15441.     rscy&(tree&)=y&
  15442.     '
  15443.     OB_X(rsc_adr%(tree&),0)=ADD(x&,3)
  15444.     OB_Y(rsc_adr%(tree&),0)=ADD(y&,3)
  15445.     '                                                      ! Neuen Hintergr. holen
  15446.     rsc_bitblt(0,0,0,rsc_handle%(tree&),rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&),0,0)
  15447.     '                                                      ! Dialog hinsetzen...
  15448.     IF a%                                                  ! Hintergrund gerettet...
  15449.       rsc_bitblt(a%,rscw&(tree&),rsch&(tree&),0,0,0,0,0,rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&))
  15450.       ~MFREE(a%)
  15451.     ELSE                                                   ! Sonst wenigstens...
  15452.       ~OBJC_DRAW(rsc_adr%(tree&),0,10,rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  15453.       IF edit_obj&
  15454.         rsc_cursor(rsc_adr%(tree&),edit_obj&,idx&)           ! ...Cursor ein
  15455.       ENDIF
  15456.     ENDIF
  15457.     '
  15458.   ENDIF
  15459.   '
  15460. RETURN
  15461. > PROCEDURE rsc_movedial(tree&,edit_obj&,idx&)  ! SOLID
  15462.   LOCAL x&,y&,w&,h&,fx&,fy&,mx&,my&,mb&,shift&,rsc%
  15463.   '
  15464.   w&=rscw&(tree&)
  15465.   h&=rsch&(tree&)
  15466.   '
  15467.   ~GRAF_MKSTATE(mx&,my&,x&,y&)
  15468.   ' Nicht zusätzl. rechte Maustaste oder SHIFT/CONTROL/ALT...
  15469.   IF NOT (x&=3 OR AND(y&,&X1111)>0)
  15470.     rsc%=MALLOC(@getsize(w&,h&))                    ! Dialog retten
  15471.   ENDIF
  15472.   IF rsc%                                           ! Hat geklappt...
  15473.     rsc_bitblt(0,0,0,rsc%,w&,h&,rscx&(tree&),rscy&(tree&),w&,h&,0,0)
  15474.   ENDIF
  15475.   '
  15476.   ~GRAF_MOUSE(4,0)                                  ! FLAT_HAND
  15477.   '
  15478.   ~GRAF_MKSTATE(mx&,my&,mb&,shift&)
  15479.   fx&=SUB(mx&,SUCC(rscx&(tree&)))                   ! Relativer Mausfaktor
  15480.   fy&=SUB(my&,SUCC(rscy&(tree&)))
  15481.   '
  15482.   mx&=rscx&(tree&)
  15483.   my&=rscy&(tree&)
  15484.   ' ------------------------------------------------- Bewegen
  15485.   IF rsc%                                           ! SOLID...
  15486.     REPEAT
  15487.       '
  15488.       ~GRAF_MKSTATE(x&,y&,mb&,shift&)
  15489.       '
  15490.       x&=SUB(PRED(x&),fx&)
  15491.       y&=SUB(PRED(y&),fy&)                          ! Clipping...
  15492.       x&=MIN(MAX(x&,deskx&),SUB(ADD(deskx&,deskw&),w&))
  15493.       y&=MIN(MAX(y&,desky&),SUB(ADD(desky&,deskh&),h&))
  15494.       '
  15495.       IF mx&<>x& OR my&<>y&
  15496.         rsc_flipping(rsc_handle%(tree&),rsc%,mx&,my&,w&,h&,x&,y&)
  15497.         mx&=x&
  15498.         my&=y&
  15499.         '
  15500.       ENDIF
  15501.       '
  15502.     UNTIL mb&=0
  15503.     '
  15504.     ~MFREE(rsc%)
  15505.     '
  15506.   ELSE                                              ! Nicht SOLID...
  15507.     rsc_bitblt(rsc_handle%(tree&),rscw&(tree&),rsch&(tree&),0,0,0,0,0,rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&))
  15508.     ~GRAF_DRAGBOX(rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&),deskx&,desky&,deskw&,deskh&,x&,y&)
  15509.   ENDIF
  15510.   ' ------------------------------------------------- Hinsetzen
  15511.   rscx&(tree&)=x&
  15512.   rscy&(tree&)=y&
  15513.   OB_X(rsc_adr%(tree&),0)=ADD(x&,3)
  15514.   OB_Y(rsc_adr%(tree&),0)=ADD(y&,3)
  15515.   '
  15516.   IF rsc%=0                                         ! Nicht SOLID...
  15517.     rsc_bitblt(0,0,0,rsc_handle%(tree&),rscw&(tree&),rsch&(tree&),rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&),0,0)
  15518.     ~OBJC_DRAW(rsc_adr%(tree&),0,10,rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  15519.     '
  15520.     IF edit_obj&
  15521.       rsc_cursor(rsc_adr%(tree&),edit_obj&,idx&)    ! ...Cursor ein
  15522.     ENDIF
  15523.   ENDIF
  15524.   '
  15525.   ~GRAF_MOUSE(0,0)
  15526.   '
  15527. RETURN
  15528. > PROCEDURE rsc_flipping(rsc_back%,rsc%,ax&,ay&,w&,h&,x&,y&)
  15529.   LOCAL rb&,rh&,gw&,gh&
  15530.   '
  15531.   gw&=ABS(SUB(x&,ax&))         ! Verschiebbreite
  15532.   gh&=ABS(SUB(y&,ay&))         ! Verschiebhöhe
  15533.   rb&=SUB(w&,gw&)              ! Restbreite
  15534.   rh&=SUB(h&,gh&)              ! Resthöhe
  15535.   '
  15536.   IF rb&<0 OR rh&<0            ! rsc% außerhalb von rsc_back%
  15537.     '
  15538.     ' Gesamten Hintergrund restaurieren -----
  15539.     rsc_bitblt(rsc_back%,w&,h&,0,0,0,0,0,w&,h&,ax&,ay&)
  15540.     '
  15541.     ' Gesamten Dialog aktualisieren -----
  15542.     rsc_bitblt(0,0,0,rsc_back%,w&,h&,x&,y&,w&,h&,0,0)
  15543.     '
  15544.   ELSE IF x&>ax&               ! nach rechts...
  15545.     '
  15546.     IF y&>ay&                  ! nach rechts-unten veschoben
  15547.       '
  15548.       ' Hintergrund restaurieren -----
  15549.       rsc_bitblt(rsc_back%,w&,h&,0,0,0,0,gh&,gw&,rh&,ax&,ADD(ay&,gh&))
  15550.       rsc_bitblt(rsc_back%,w&,h&,0,0,0,0,0,w&,gh&,ax&,ay&)
  15551.       '
  15552.       ' Dialog aktualisieren -----
  15553.       rsc_bitblt(rsc_back%,w&,h&,rsc_back%,w&,h&,gw&,gh&,rb&,rh&,0,0)
  15554.       rsc_bitblt(0,0,0,rsc_back%,w&,h&,x&,ADD(y&,rh&),rb&,gh&,0,rh&)
  15555.       rsc_bitblt(0,0,0,rsc_back%,w&,h&,ADD(x&,rb&),y&,gw&,h&,rb&,0)
  15556.       '
  15557.     ELSE                      ! nach rechts-oben / rechts verschoben
  15558.       '
  15559.       ' Hintergrund restaurieren -----
  15560.       rsc_bitblt(rsc_back%,w&,h&,0,0,0,0,0,gw&,rh&,ax&,ay&)
  15561.       rsc_bitblt(rsc_back%,w&,h&,0,0,0,0,rh&,w&,gh&,ax&,ADD(ay&,rh&))
  15562.       '
  15563.       ' Dialog aktualisieren -----
  15564.       rsc_bitblt(rsc_back%,w&,h&,rsc_back%,w&,h&,gw&,0,rb&,rh&,0,gh&)
  15565.       rsc_bitblt(0,0,0,rsc_back%,w&,h&,x&,y&,rb&,gh&,0,0)
  15566.       rsc_bitblt(0,0,0,rsc_back%,w&,h&,ADD(x&,rb&),y&,gw&,h&,rb&,0)
  15567.       '
  15568.     ENDIF
  15569.     '                         ! nach links / oben / unten...
  15570.   ELSE IF y&>ay&              ! nach links-unten / unten verschoben
  15571.     '
  15572.     ' Hintergrund restaurieren -----
  15573.     rsc_bitblt(rsc_back%,w&,h&,0,0,0,0,0,rb&,gh&,ax&,ay&)
  15574.     rsc_bitblt(rsc_back%,w&,h&,0,0,0,rb&,0,gw&,h&,ADD(ax&,rb&),ay&)
  15575.     '
  15576.     ' Dialog aktualisieren -----
  15577.     rsc_bitblt(rsc_back%,w&,h&,rsc_back%,w&,h&,0,gh&,rb&,rh&,gw&,0)
  15578.     rsc_bitblt(0,0,0,rsc_back%,w&,h&,x&,y&,gw&,rh&,0,0)
  15579.     rsc_bitblt(0,0,0,rsc_back%,w&,h&,x&,ADD(y&,rh&),w&,gh&,0,rh&)
  15580.     '
  15581.   ELSE                        ! nach links-oben / links / oben verschoben
  15582.     '
  15583.     ' Hintergrund restaurieren -----
  15584.     rsc_bitblt(rsc_back%,w&,h&,0,0,0,rb&,0,gw&,rh&,ADD(ax&,rb&),ay&)
  15585.     rsc_bitblt(rsc_back%,w&,h&,0,0,0,0,rh&,w&,gh&,ax&,ADD(ay&,rh&))
  15586.     '
  15587.     ' Dialog aktualisieren -----
  15588.     rsc_bitblt(rsc_back%,w&,h&,rsc_back%,w&,h&,0,0,rb&,rh&,gw&,gh&)
  15589.     rsc_bitblt(0,0,0,rsc_back%,w&,h&,x&,y&,w&,gh&,0,0)
  15590.     rsc_bitblt(0,0,0,rsc_back%,w&,h&,x&,ADD(y&,gh&),gw&,rh&,0,gh&)
  15591.     '
  15592.   ENDIF
  15593.   '
  15594.   rsc_bitblt(rsc%,w&,h&,0,0,0,0,0,w&,h&,x&,y&)
  15595.   '
  15596. RETURN
  15597. ' ------------------------------------------------------------------------------
  15598. ' Zeichengenaues Cursor-Positionieren mit der Maus...
  15599. ' Nur die entsprechenden 2 Zeilen in 'rsc_do' (ziemlich am Ende) entREMen.
  15600. '
  15601. > PROCEDURE rsc_set_cursor(rsc_adr%,mx&,my&,VAR edit_obj&,next_obj&,idx&)
  15602.   LOCAL x&,a&,i&,ob_spec%,a$
  15603.   '
  15604.   ob_spec%=OB_SPEC(rsc_adr%,next_obj&)
  15605.   '
  15606.   ~OBJC_OFFSET(rsc_adr%,next_obj&,x&,a&)          ! Absolute X-Position
  15607.   '
  15608.   x&=DIV(SUB(mx&+SHR(wchar&,2),x&),wchar&)        ! Spaltenposition
  15609.   '
  15610.   a$=CHAR{{ADD(ob_spec%,4)}}                      ! Maske lesen
  15611.   '
  15612.   FOR a&=1 TO x&                                  ! Pos. im Eingabefeld...
  15613.     IF MID$(a$,a&,1)="_"
  15614.       INC i&                                      ! ...nur relevante
  15615.     ENDIF
  15616.   NEXT a&
  15617.   SUB x&,(x&-i&)
  15618.   '
  15619.   ~OBJC_EDIT(rsc_adr%,edit_obj&,0,idx&,3,idx&)    ! Cursor aus
  15620.   '
  15621.   ob_spec%=ADD({ob_spec%},x&)
  15622.   '
  15623.   a&=BYTE{ob_spec%}                               ! Zeichen merken
  15624.   BYTE{ob_spec%}=0                                ! ...und durch 0 ersetzen
  15625.   '
  15626.   ~OBJC_EDIT(rsc_adr%,next_obj&,0,idx&,1,idx&)    ! Cursor setzen
  15627.   BYTE{ob_spec%}=a&                               ! ...und Zeichen restaurieren
  15628.   '
  15629.   edit_obj&=next_obj&
  15630.   '
  15631. RETURN
  15632. ' ------------------------------------------------------------------------------
  15633. ' Setzen und Auslesen der Popup-Menüeinträge...
  15634. '
  15635. > PROCEDURE rsc_write_popup(tree&,button&,default&)
  15636.   LOCAL i&,popup&,obj&
  15637.   '
  15638.   ' Belegt einen Popup-Button mit dem Text des Popup-Eintrags
  15639.   ' 'default&' (also von 1-x)...
  15640.   '
  15641.   ' tree&   : Index des Objektbaumes
  15642.   ' button& : Objektnummer des Buttons
  15643.   ' default&: Nummer des zu setzenden Menü-Eintrages (1-x)
  15644.   '
  15645.   popup&=SUB(SHR&(OB_TYPE(rsc_adr%(tree&),button&),8),30)! Nr. des Popup-Baumes
  15646.   obj&=1
  15647.   '
  15648.   FOR i&=1 TO PRED(popup&)
  15649.     obj&=OB_NEXT(rsc_adr%(rsc_popup&),obj&)              ! Objektnr. des Popups
  15650.   NEXT i&
  15651.   '                                                      ! Button belegen
  15652.   rsc_text(tree&,button&,@rsc_text$(rsc_popup&,ADD(obj&,default&)))
  15653. RETURN
  15654. > FUNCTION rsc_read_popup(tree&,button&)
  15655.   $F%
  15656.   LOCAL a&,i&,popup&,obj&,a$
  15657.   '
  15658.   ' Gibt den Index des gesetzten Popup-Eintrags zurück...
  15659.   '
  15660.   ' tree&   : Index des Objektbaumes
  15661.   ' button& : Objektnummer des Buttons
  15662.   '
  15663.   popup&=SHR&(OB_TYPE(rsc_adr%(tree&),button&),8)-30     ! Nr. des Popup-Baumes
  15664.   obj&=1
  15665.   '
  15666.   FOR i&=1 TO PRED(popup&)
  15667.     obj&=SUCC(OB_TAIL(rsc_adr%(rsc_popup&),obj&))        ! Objektnr. des Popups
  15668.   NEXT i&
  15669.   '                                                      ! Button belegen
  15670.   a$=@rsc_text$(tree&,button&)
  15671.   '
  15672.   a&=OB_TAIL(rsc_adr%(rsc_popup&),obj&)
  15673.   DO WHILE a$<>@rsc_text$(rsc_popup&,a&)
  15674.     DEC a&
  15675.   LOOP UNTIL a&<=obj&
  15676.   '
  15677.   RETURN SUB(a&,obj&)
  15678. ENDFUNC
  15679. ' ------------------------------------------------------------------------------
  15680. ' Setzt ein Popup auf 'anz&' Einträge...
  15681. '
  15682. > PROCEDURE rsc_set_popup(popup&,anz&)
  15683.   LOCAL a&,obj&
  15684.   '
  15685.   ' popup&: Objektnummer des Popup-Menüs
  15686.   ' anz&  : Neue Anzahl Einträge
  15687.   '
  15688.   ' ----------------------------------------- Alle Einträge aktivieren...
  15689.   obj&=OB_TAIL(rsc_adr%(rsc_popup&),popup&) ! Letzter Eintrag des Popup's
  15690.   '
  15691.   a&=OB_NEXT(rsc_adr%(rsc_popup&),obj&)     ! Darauf folgender
  15692.   '
  15693.   WHILE a&=popup&                           ! Zeigt auf's Parent-Objekt...
  15694.     INC obj&                                ! ...nächster Eintrag
  15695.     '
  15696.     a&=OB_NEXT(rsc_adr%(rsc_popup&),obj&)
  15697.     IF a&>0 AND a&<=SUCC(obj&)              ! Existiert...
  15698.       ~OBJC_ADD(rsc_adr%(rsc_popup&),popup&,obj&)
  15699.     ENDIF                                   ! ...wieder aktivieren
  15700.     '
  15701.   WEND
  15702.   '
  15703.   ' ----------------------------------------- Einträge entfernen...
  15704.   a&=OB_TAIL(rsc_adr%(rsc_popup&),popup&)   ! Letzter Eintrag des Popup's
  15705.   '
  15706.   FOR obj&=a& DOWNTO ADD(popup&,SUCC(anz&)) ! Von hinten nach vorne...
  15707.     ~OBJC_DELETE(rsc_adr%(rsc_popup&),obj&) ! ...entfernen
  15708.   NEXT obj&
  15709.   '
  15710.   ' ----------------------------------------- Neue Höhe setzen
  15711.   OB_H(rsc_adr%(rsc_popup&),popup&)=MUL(hchar&,anz&)
  15712.   '
  15713. RETURN
  15714. ' ------------------------------------------------------------------------------
  15715. ' Menüshortcut ermitteln...
  15716. '
  15717. > FUNCTION rsc_shortcut(tree&,scan|,shift&,VAR title&)
  15718.   $F%
  15719.   LOCAL a&,obj&,rsc_adr%,s$,t$
  15720.   '
  15721.   ' tree&      : Index des Menübaumes
  15722.   ' scan|      : SCAN-Code der gedrückten Taste
  15723.   ' shift&     : Status der tastaturumschalttasten
  15724.   ' VAR title& : Bei Erfolg Objektnummer des Menütitels
  15725.   '
  15726.   SELECT scan|
  15727.   CASE 2 TO 10                                   ! 1-2...
  15728.     s$=CHR$(ADD(47,scan|))
  15729.   CASE 15                                        ! TAB...
  15730.     s$="I"
  15731.     shift&=BSET(shift&,2)                        ! ...entspricht "^I"
  15732.     '
  15733.   CASE 59 TO 68,84 TO 93                         ! Ftasten...
  15734.     IF scan|<84
  15735.       s$="F"+STR$(SUB(scan|,58))                 ! ...normal
  15736.     ELSE
  15737.       s$="F"+STR$(SUB(scan|,83))                 ! ...mit Shift
  15738.     ENDIF
  15739.   CASE 71                                        ! ClrHome...
  15740.     s$="CLR"
  15741.   CASE 97                                        ! UNDO...
  15742.     s$="UNDO"
  15743.   CASE 98                                        ! HELP...
  15744.     s$="HELP"
  15745.   DEFAULT                                        ! Alles andere...
  15746.     rsc_adr%={XBIOS(16,L:-1,L:-1,L:-1)}
  15747.     s$=CHR$(BCLR(BYTE{ADD(rsc_adr%,scan|)},5))
  15748.   ENDSELECT
  15749.   '
  15750.   IF BTST(shift&,3)                              ! Alternate...
  15751.     s$=CHR$(7)+s$
  15752.   ENDIF
  15753.   IF BTST(shift&,2)                              ! Control...
  15754.     s$="^"+s$
  15755.   ENDIF
  15756.   IF BTST(shift&,0) OR BTST(shift&,1)            ! Shift...
  15757.     s$=CHR$(1)+s$
  15758.   ENDIF
  15759.   '
  15760.   title&=2                                       ! Position des Titels
  15761.   obj&=5                                         ! Beginn der eigentl. Menüs
  15762.   rsc_adr%=rsc_adr%(tree&)                       ! Übersichtlicher
  15763.   '
  15764.   REPEAT                                         ! alle Objekte d. Menübaums
  15765.     INC obj&
  15766.     '
  15767.     IF BYTE(OB_TYPE(rsc_adr%,obj&))=28           ! G_STRING...
  15768.       IF NOT BTST(OB_STATE(rsc_adr%,obj&),3)     ! disabled ?
  15769.         '
  15770.         t$=TRIM$(CHAR{OB_SPEC(rsc_adr%,obj&)})   ! Menüpunkt-Text
  15771.         '
  15772.         a&=RINSTR(t$," ")
  15773.         IF a&                                    ! Shortcut vorhanden ?
  15774.           '
  15775.           IF MID$(t$,SUCC(a&))=s$                ! hier der vermutete Shortcut
  15776.             RETURN obj&                          ! gefunden
  15777.           ENDIF
  15778.           '
  15779.         ENDIF
  15780.       ENDIF
  15781.       '
  15782.     ELSE IF BYTE(OB_TYPE(rsc_adr%,obj&))=20      ! G_STRING ?
  15783.       INC title&
  15784.     ENDIF
  15785.   UNTIL BTST(OB_FLAGS(rsc_adr%,obj&),5)          ! LAST_OB ?
  15786.   '
  15787.   title&=0
  15788.   RETURN 0                                       ! nicht gef. oder disabled
  15789. ENDFUNC
  15790. ' ------------------------------------------------------------------------------
  15791. ' Fliegende ALERT-Box...
  15792. '
  15793. FUNCTION rsc_alert(icon&,text$,button$,def&)
  15794.   $F%
  15795.   LOCAL a&,b&,h&,i&,l&,len&,w&,x&,y&,z&,ab&,ah&,rsc&,rsc_adr%,a$
  15796.   '
  15797.   ' Alert-Box darstellen...
  15798.   '
  15799.   IF rsc_alert&>-1                                       ! Wenn's den Baum gibt:
  15800.     rsc_adr%=rsc_adr%(rsc_alert&)                        ! rsc_alert=GLOBAL
  15801.     '
  15802.     text$=text$+"|"
  15803.     button$=button$+"|"
  15804.     ' ---------------------------------------------------- Icon bestimmen
  15805.     OB_FLAGS(rsc_adr%,2)=BSET(OB_FLAGS(rsc_adr%,2),7)    ! Hidden...
  15806.     OB_FLAGS(rsc_adr%,3)=BSET(OB_FLAGS(rsc_adr%,3),7)
  15807.     OB_FLAGS(rsc_adr%,4)=BSET(OB_FLAGS(rsc_adr%,4),7)
  15808.     ' gewünschtes sichtbar machen
  15809.     OB_FLAGS(rsc_adr%,SUCC(icon&))=BCLR(OB_FLAGS(rsc_adr%,SUCC(icon&)),7)
  15810.     ' ---------------------------------------------------- Buttons
  15811.     OB_FLAGS(rsc_adr%,10)=OR(&X101,AND(&X1111111100000000,OB_FLAGS(rsc_adr%,10)))    ! EXIT+SELECTABLE
  15812.     OB_FLAGS(rsc_adr%,11)=OR(&X101,AND(&X1111111100000000,OB_FLAGS(rsc_adr%,11)))    ! EXIT+SELECTABLE
  15813.     OB_FLAGS(rsc_adr%,12)=OR(&X100101,AND(&X1111111100000000,OB_FLAGS(rsc_adr%,12))) ! LAST_OB+EXIT+SELECT.
  15814.     '                                                    ! Default-Button...
  15815.     OB_FLAGS(rsc_adr%,9+def&)=BSET(OB_FLAGS(rsc_adr%,9+def&),1)
  15816.     ' ---------------------------------------------------- Textzeilen setzen
  15817.     FOR i&=1 TO 5
  15818.       a&=INSTR(text$,"|")
  15819.       a$=LEFT$(text$,MIN(30,MAX(0,PRED(a&))))
  15820.       text$=MID$(text$,SUCC(a&))
  15821.       '
  15822.       z&=MAX(z&,-i&*(a$<>""))                            ! Höchste belegte Zeile
  15823.       l&=MAX(l&,LEN(a$))                                 ! Längste Zeile
  15824.       '
  15825.       rsc_text(rsc_alert&,ADD(4,i&),a$)                  ! Setzen
  15826.     NEXT i&
  15827.     ' ---------------------------------------------------- Button-Texte setzen
  15828.     FOR i&=1 TO 3
  15829.       a&=INSTR(button$,"|")
  15830.       a$=LEFT$(button$,MIN(10,MAX(0,PRED(a&))))
  15831.       button$=MID$(button$,SUCC(a&))
  15832.       IF INSTR(a$,"Abb")>0 OR INSTR(a$,"bruch")>0 OR INSTR(a$,"urück")>0  ! wg. [ für unterstreichen geteilt
  15833.         OB_FLAGS(rsc_adr%,i&+9)=BSET(OB_FLAGS(rsc_adr%,i&+9),14)    ! Undo
  15834.       ENDIF
  15835.       '
  15836.       ADD b&,-(a$<>"")                                   ! Anzahl Buttons
  15837.       len&=MAX(len&,LEN(a$))                             ! Längster Button
  15838.       '
  15839.       rsc_text(rsc_alert&,ADD(9,i&),a$)                  ! Setzen
  15840.     NEXT i&
  15841.     ' ---------------------------------------------------- Dialog-Breite ändern
  15842.     l&=MAX(l&,MUL(10,b&))                                ! Minimal-Breite
  15843.     '
  15844.     w&=OB_W(rsc_adr%,3)+MUL(wchar&,ADD(l&,5))
  15845.     OB_W(rsc_adr%,0)=w&                                  ! Neue Breite
  15846.     '
  15847.     OB_X(rsc_adr%,1)=w&-PRED(OB_W(rsc_adr%,1))           ! Flydial verschieben
  15848.     rscw&(rsc_alert&)=ADD(w&,6)
  15849.     ' ---------------------------------------------------- Dialog-Höhe ändern
  15850.     h&=OB_H(rsc_adr%,10)+MUL(hchar&,ADD(z&,2))
  15851.     OB_H(rsc_adr%,0)=h&                                  ! Neue Höhe
  15852.     rsch&(rsc_alert&)=ADD(h&,6)
  15853.     ' ---------------------------------------------------- Buttons plazieren
  15854.     len&=MUL(wchar&,SUCC(len&))
  15855.     OB_W(rsc_adr%,10)=len&                               ! Breite anpassen..
  15856.     OB_W(rsc_adr%,11)=len&
  15857.     OB_W(rsc_adr%,12)=len&
  15858.     '
  15859.     SELECT b&                                            ! Anzahl Buttons...
  15860.     CASE 1
  15861.       OB_FLAGS(rsc_adr%,11)=BSET(OB_FLAGS(rsc_adr%,11),7)! ...hidden
  15862.       OB_FLAGS(rsc_adr%,12)=BSET(OB_FLAGS(rsc_adr%,12),7)! ...hidden
  15863.       ' OB_X(rsc_adr%,10)=SHR(SUB(w&,OB_W(rsc_adr%,10)),1)
  15864.       OB_X(rsc_adr%,10)=SUB(w&,OB_W(rsc_adr%,10))-2*wchar&
  15865.       '
  15866.     CASE 2
  15867.       OB_FLAGS(rsc_adr%,12)=BSET(OB_FLAGS(rsc_adr%,12),7)! ...hidden
  15868.       x&=w&-OB_W(rsc_adr%,11)-2*wchar&
  15869.       OB_X(rsc_adr%,11)=x&
  15870.       OB_X(rsc_adr%,10)=x&-OB_W(rsc_adr%,10)-wchar&
  15871.       '
  15872.     CASE 3
  15873.       ' x&=SHR(SUB(w&,OB_W(rsc_adr%,10)),1)                ! ...Mitte
  15874.       ' OB_X(rsc_adr%,10)=x&-OB_W(rsc_adr%,10)-wchar&
  15875.       ' OB_X(rsc_adr%,11)=x&
  15876.       ' OB_X(rsc_adr%,12)=x&+OB_W(rsc_adr%,10)+wchar&
  15877.       x&=w&-OB_W(rsc_adr%,12)-2*wchar&
  15878.       OB_X(rsc_adr%,12)=x&
  15879.       OB_X(rsc_adr%,11)=x&-OB_W(rsc_adr%,10)-wchar&
  15880.       OB_X(rsc_adr%,10)=OB_X(rsc_adr%,11)-OB_W(rsc_adr%,10)-wchar&
  15881.       '
  15882.     ENDSELECT
  15883.     '
  15884.     y&=h&-OB_H(rsc_adr%,10)-SHR(hchar&,1)
  15885.     OB_Y(rsc_adr%,10)=y&
  15886.     OB_Y(rsc_adr%,11)=y&
  15887.     OB_Y(rsc_adr%,12)=y&
  15888.     ' ---------------------------------------------------- Anzeigen
  15889.     ~FORM_CENTER(rsc_adr%(rsc_alert&),rscx&(rsc_alert&),rscy&(rsc_alert&),rscw&(rsc_alert&),rsch&(rsc_alert&))
  15890.     '
  15891.     rsc_draw(rsc_alert&,FALSE)
  15892.     '
  15893.     rsc&=@rsc_do(rsc_alert&,0,a&)
  15894.     '
  15895.     rsc_back(rsc_alert&)
  15896.     ' ----------------------------------------------------
  15897.     OB_STATE(rsc_adr%,rsc&)=BCLR(OB_STATE(rsc_adr%,rsc&),0)! SELECTED löschen
  15898.     '
  15899.     RETURN SUB(rsc&,9)                                   ! Nummer des Buttons 1-3
  15900.   ENDIF
  15901.   '                                                      ! Normaler Alert...
  15902.   RETURN FORM_ALERT(def&,"["+STR$(icon&)+"]["+text$+"]["+button$+"]")
  15903. ENDFUNC
  15904. ' ------------------------------------------------------------------------------
  15905. ' Ersatz für RSRC_LOAD(file$). Die RSC-Datei kann in einem INLINE direkt im
  15906. ' Programmcode abgelegt werden, diese Funktion bekommt die Adresse des INLINES
  15907. ' übergeben und initialisiert die Resource...
  15908. '
  15909. > FUNCTION rsrc_conv(r_ra%)
  15910.   $F%
  15911.   '     r_ra%                            ! RSC INLINE Adresse
  15912.   LOCAL r_buf!                           ! TRUE=RSC Daten puffern
  15913.   LOCAL r_pa%                            ! Puffer-Adresse
  15914.   LOCAL r_o&,r_t&                        ! Laufvar
  15915.   LOCAL r_ob&                            ! Beginn des Objekt Feldes
  15916.   LOCAL r_no&                            ! Anzahl OBJECTS
  15917.   LOCAL r_nt&                            ! Anzahl TREES
  15918.   LOCAL r_rs&                            ! Länge des INLINEs
  15919.   LOCAL r_napt%                          ! neue TREE Table Adresse
  15920.   LOCAL r_gb%                            ! Adresse des AES Global Feldes
  15921.   LOCAL r_of%                            ! Objekt Feld
  15922.   LOCAL r_ns&                            ! Anzahl der freien Strings
  15923.   LOCAL r_ni&                            ! Anzahl der freien Images
  15924.   LOCAL r_adr%,r_i&                      ! Hilfsvar, Laufvar
  15925.   '
  15926.   r_buf!=(BYTE{ADD(BASEPAGE,256)}=96)    ! Im Interpreter? ==>puffern
  15927.   '
  15928.   r_rs&=WORD{ADD(r_ra%,&H22)}            ! Länge des INLINEs
  15929.   IF r_buf! AND DIM?(rsc_buf|())>0       ! Ist RSC Buf schon dimensioniert?...
  15930.     r_rs&=0
  15931.   ENDIF
  15932.   '
  15933.   IF r_rs&>0
  15934.     '
  15935.     IF r_buf!                            ! RSC Daten puffern (nur Interpreter)...
  15936.       DIM rsc_buf|(r_rs&)
  15937.       r_pa%=ADD({*rsc_buf|()},4)
  15938.       BMOVE r_ra%,r_pa%,r_rs&
  15939.       r_ra%=r_pa%
  15940.     ENDIF
  15941.     '
  15942.     r_napt%=ADD(r_ra%,WORD{ADD(r_ra%,&H12)})       ! neue Adresse der Tree Tabelle
  15943.     r_gb%={ADD(GB,4)}                    ! Adr. des AES-GLOBAL-Feldes
  15944.     {ADD(r_gb%,10)}=r_napt%              ! GLOBAL(5/6): neue Tabellen Adr.
  15945.     r_ob&=WORD{ADD(r_ra%,2)}             ! bisheriger Start Objekt Feld
  15946.     r_of%=ADD(r_ra%,r_ob&)               ! Neue Startadr. Objekt Feld
  15947.     r_no&=PRED(WORD{ADD(r_ra%,&H14)})    ! Anzahl der Objekte im File -1
  15948.     r_nt&=PRED(WORD{ADD(r_ra%,&H16)})    ! Anzahl der Trees in File  -1
  15949.     '
  15950.     FOR r_o&=0 TO r_no&                  ! Alle Objekte durchgehen...
  15951.       ~RSRC_OBFIX(r_of%,r_o&)            ! ...Koordinaten umrechnen
  15952.       '
  15953.       SELECT BYTE(OB_TYPE(r_of%,r_o&))   ! Objekt-Typ...
  15954.         '
  15955.       CASE 21,22,29,30,31                ! ...G_TEXT,G_BOXTEXT,G_FTEXT,G_FBOXTEXT,G_ICON
  15956.         OB_SPEC(r_of%,r_o&)=ADD(OB_SPEC(r_of%,r_o&),r_ra%)
  15957.         {OB_SPEC(r_of%,r_o&)}=ADD({OB_SPEC(r_of%,r_o&)},r_ra%)
  15958.         {ADD(OB_SPEC(r_of%,r_o&),4)}=ADD({ADD(OB_SPEC(r_of%,r_o&),4)},r_ra%)
  15959.         {ADD(OB_SPEC(r_of%,r_o&),8)}=ADD({ADD(OB_SPEC(r_of%,r_o&),8)},r_ra%)
  15960.         '
  15961.       CASE 24                            ! ...G_USERDEF
  15962.         OB_SPEC(r_of%,r_o&)=ADD(OB_SPEC(r_of%,r_o&),r_ra%)
  15963.         {OB_SPEC(r_of%,r_o&)}=ADD({OB_SPEC(r_of%,r_o&)},r_ra%)
  15964.         {ADD(OB_SPEC(r_of%,r_o&),4)}=ADD({ADD(OB_SPEC(r_of%,r_o&),4)},r_ra%)
  15965.         '
  15966.       CASE 23                            ! ...G_IMAGE
  15967.         OB_SPEC(r_of%,r_o&)=ADD(OB_SPEC(r_of%,r_o&),r_ra%)
  15968.         {OB_SPEC(r_of%,r_o&)}=ADD({OB_SPEC(r_of%,r_o&)},r_ra%)
  15969.         '
  15970.       CASE 26,28,32                      ! ...G_BUTTON,G_STRING,G_TITLE
  15971.         OB_SPEC(r_of%,r_o&)=ADD(OB_SPEC(r_of%,r_o&),r_ra%)
  15972.       ENDSELECT
  15973.       '
  15974.     NEXT r_o&
  15975.     '
  15976.     FOR r_t&=0 TO r_nt&
  15977.       {ADD(r_napt%,MUL(4,r_t&))}=ADD({ADD(r_napt%,MUL(4,r_t&))},r_ra%)
  15978.     NEXT r_t&
  15979.     '
  15980.     r_ns&=PRED(WORD{ADD(r_ra%,&H1E)})
  15981.     IF r_ns&>-1
  15982.       r_adr%=ADD(r_ra%,WORD{ADD(r_ra%,&HA)})
  15983.       FOR r_i&=0 TO r_ns&
  15984.         {ADD(r_adr%,MUL(4,r_i&))}=ADD({ADD(r_adr%,MUL(4,r_i&))},r_ra%)
  15985.       NEXT r_i&
  15986.     ENDIF
  15987.     '
  15988.     r_ni&=PRED(WORD{ADD(r_ra%,&H20)})
  15989.     IF r_ni&>-1
  15990.       r_adr%=ADD(r_ra%,WORD{ADD(r_ra%,&H10)})
  15991.       '
  15992.       FOR r_i&=0 TO r_ni&
  15993.         {ADD(r_adr%,MUL(4,r_i&))}=ADD({ADD(r_adr%,MUL(4,r_i&))},r_ra%)
  15994.         {{ADD(r_adr%,MUL(4,r_i&))}}=ADD({{ADD(r_adr%,MUL(4,r_i&))}},r_ra%)
  15995.       NEXT r_i&
  15996.       '
  15997.     ENDIF
  15998.     '
  15999.   ENDIF
  16000.   '
  16001.   RETURN r_rs&
  16002. ENDFUNC
  16003. ' ------------------------------------------------------------------------------
  16004. ' Retten und Restaurieren eines Dialogs zum Aufruf einer Dateiauswahlbox...
  16005. '
  16006. > PROCEDURE rsc_save_dialog(tree&)
  16007.   LOCAL x&,y&,w&,h&,i&,a%
  16008.   '
  16009.   ' Rettet den(die) Dialog(e) z.B. für den Aufruf eines Fileselectors...
  16010.   '                                               ! Kein Fenster-Dialog...
  16011.   IF NOT (rsc_handle%(tree&)>0 AND rsc_handle%(tree&)<1000)
  16012.     '
  16013.     x&=rscx&(tree&)
  16014.     y&=rscy&(tree&)
  16015.     FOR i&=1 TO SHR(LEN(rsc_list$),1)             ! Größten Dialog rausfinden...
  16016.       tree&=CVI(MID$(rsc_list$,SUCC(SHL(PRED(i&),1))))
  16017.       x&=MIN(x&,rscx&(tree&))
  16018.       y&=MIN(y&,rscy&(tree&))
  16019.       w&=MAX(w&,ADD(rscx&(tree&),rscw&(tree&)))
  16020.       h&=MAX(h&,ADD(rscy&(tree&),rsch&(tree&)))
  16021.     NEXT i&
  16022.     SUB w&,x&
  16023.     SUB h&,y&
  16024.     '
  16025.     a%=MALLOC(@getsize(w&,h&)+8)
  16026.     IF a%                                         ! Hintergrund retten...
  16027.       rsc_bitblt(0,0,0,ADD(a%,8),w&,h&,x&,y&,w&,h&,0,0)
  16028.       '
  16029.       INT{a%}=x&                                  ! Koordinaten eintragen...
  16030.       INT{ADD(a%,2)}=y&
  16031.       INT{ADD(a%,4)}=w&
  16032.       INT{ADD(a%,6)}=h&
  16033.       '
  16034.       rsc_save%=a%                                ! In globaler Variablen merken...
  16035.       '
  16036.       GRAPHMODE 4                                 ! Dialog disablen...
  16037.       DEFFILL 0,2,4
  16038.       ~GRAF_MOUSE(256,0)                          ! Hidem
  16039.       '
  16040.       PBOX SUCC(x&),SUCC(y&),ADD(PRED(x&),PRED(w&)),ADD(PRED(y&),PRED(h&))
  16041.       '
  16042.       ~GRAF_MOUSE(257,0)                          ! Showm
  16043.       DEFFILL 1,0
  16044.       GRAPHMODE 1
  16045.       '
  16046.     ENDIF
  16047.     '
  16048.   ENDIF
  16049.   '
  16050. RETURN
  16051. > PROCEDURE rsc_restore_dialog(tree&)
  16052.   LOCAL w&,h&,i&
  16053.   '
  16054.   ' Restauriert den(die) Dialog(e) z.B. nach einem Fileselector...
  16055.   '                                               ! Kein Fenster-Dialog...
  16056.   IF NOT (rsc_handle%(tree&)>0 AND rsc_handle%(tree&)<1000)
  16057.     '
  16058.     IF rsc_save%                                  ! Hintergrund wurde gerettet...
  16059.       w&=INT{ADD(rsc_save%,4)}
  16060.       h&=INT{ADD(rsc_save%,6)}
  16061.       rsc_bitblt(ADD(rsc_save%,8),w&,h&,0,0,0,0,0,w&,h&,INT{rsc_save%},INT{ADD(rsc_save%,2)})
  16062.       '
  16063.       ~MFREE(rsc_save%)                           ! ...freigeben
  16064.       rsc_save%=0
  16065.       '
  16066.     ELSE                                          ! Nicht gerettet...
  16067.       '
  16068.       FOR i&=1 TO SHR(LEN(rsc_list$),1)           ! Dialog-Liste durchgehen...
  16069.         tree&=CVI(MID$(rsc_list$,SUCC(SHL(PRED(i&),1))))
  16070.         ~OBJC_DRAW(rsc_adr%(tree&),0,100,rscx&(tree&),rscy&(tree&),rscw&(tree&),rsch&(tree&))
  16071.       NEXT i&                                     ! ...und zeichnen
  16072.       '
  16073.     ENDIF
  16074.     '
  16075.   ENDIF
  16076.   '
  16077. RETURN
  16078. ' ------------------------------------------------------------------------------
  16079. ' Setzen und Abfragen einzelner Bits in OB_STATE und OB_FLAGS...
  16080. '
  16081. > PROCEDURE rsc_state(tree&,obj&,bit&,stat!)
  16082.   '
  16083.   ' tree& : Index des Objektbaumes
  16084.   ' obj&  : Objektnummer
  16085.   ' bit&  : Zu setzendes Bit
  16086.   ' stat! : TRUE =Bit setzen, FALSE =Bit löschen
  16087.   '
  16088.   IF stat!
  16089.     OB_STATE(rsc_adr%(tree&),obj&)=BSET(OB_STATE(rsc_adr%(tree&),obj&),bit&)
  16090.   ELSE
  16091.     OB_STATE(rsc_adr%(tree&),obj&)=BCLR(OB_STATE(rsc_adr%(tree&),obj&),bit&)
  16092.   ENDIF
  16093.   '
  16094. RETURN
  16095. > PROCEDURE rsc_flags(tree&,obj&,bit&,stat!)
  16096.   '
  16097.   ' tree& : Index des Objektbaumes
  16098.   ' obj&  : Objektnummer
  16099.   ' bit&  : Zu setzendes Bit
  16100.   ' stat! : TRUE =Bit setzen, FALSE =Bit löschen
  16101.   '
  16102.   IF stat!
  16103.     OB_FLAGS(rsc_adr%(tree&),obj&)=BSET(OB_FLAGS(rsc_adr%(tree&),obj&),bit&)
  16104.   ELSE
  16105.     OB_FLAGS(rsc_adr%(tree&),obj&)=BCLR(OB_FLAGS(rsc_adr%(tree&),obj&),bit&)
  16106.   ENDIF
  16107.   '
  16108. RETURN
  16109. DEFFN rsc_flags(tree&,obj&,bit&)=BTST(OB_FLAGS(rsc_adr%(tree&),obj&),bit&)
  16110. DEFFN rsc_state(tree&,obj&,bit&)=BTST(OB_STATE(rsc_adr%(tree&),obj&),bit&)
  16111. ' ------------------------------------------------------------------------------
  16112. ' Behandlung eines Tristate-Buttons...
  16113. '
  16114. > PROCEDURE rsc_tristate(tree&,obj&)
  16115.   '
  16116.   IF @rsc_state(tree&,obj&,2)                ! War gefüllt...
  16117.     rsc_state(tree&,obj&,2,FALSE)
  16118.     rsc_state(tree&,obj&,0,TRUE)             ! ...jetzt selektiert
  16119.     '
  16120.   ELSE IF NOT @rsc_state(tree&,obj&,0)       ! War nicht selektiert
  16121.     rsc_state(tree&,obj&,2,TRUE)             ! ...jetzt gefüllt
  16122.     '
  16123.   ELSE                                       ! War selektiert...
  16124.     rsc_state(tree&,obj&,0,FALSE)            ! ...jetzt leer
  16125.   ENDIF
  16126.   rsc_draw_obj(tree&,obj&)                   ! Zeichnen
  16127.   '
  16128. RETURN
  16129. ' ------------------------------------------------------------------------------
  16130. ' Zeichnen eines einzelnen Objektes...
  16131. '
  16132. > PROCEDURE rsc_draw_obj(tree&,obj&)
  16133.   LOCAL x&,y&
  16134.   '
  16135.   ~OBJC_OFFSET(rsc_adr%(tree&),obj&,x&,y&)
  16136.   ~OBJC_DRAW(rsc_adr%(tree&),obj&,8,x&,y&,OB_W(rsc_adr%(tree&),obj&),OB_H(rsc_adr%(tree&),obj&))
  16137.   '
  16138. RETURN
  16139. ' ------------------------------------------------------------------------------
  16140. ' Globales Setzen und Abfragen mehrerer Radio-Buttons...
  16141. '
  16142. > PROCEDURE rsc_set_radio(tree&,anz&,select&,VAR obj&())
  16143.   LOCAL i&
  16144.   '
  16145.   ' tree&   : Index des Objektbaumes
  16146.   ' anz&    : Anzahl Objekte
  16147.   ' select& : Index des zu selektierenden Objektes (1-x)
  16148.   ' obj&()  : Feld mit den Objektnummern
  16149.   '
  16150.   FOR i&=0 TO anz&           ! Alle Buttons deselektieren...
  16151.     OB_STATE(rsc_adr%(tree&),obj&(i&))=BCLR(OB_STATE(rsc_adr%(tree&),obj&(i&)),0)
  16152.   NEXT i&
  16153.   '                          ! Nur den gewünschten selektieren...
  16154.   OB_STATE(rsc_adr%(tree&),obj&(select&))=BSET(OB_STATE(rsc_adr%(tree&),obj&(select&)),0)
  16155.   '
  16156. RETURN
  16157. > FUNCTION rsc_get_radio(tree&,anz&,obj&,VAR obj&())
  16158.   $F%
  16159.   LOCAL i&
  16160.   '
  16161.   IF obj&>0                  ! Objekt suchen...
  16162.     '
  16163.     FOR i&=0 TO anz&
  16164.       IF obj&(i&)=obj&
  16165.         RETURN i&            ! ...der gewünschte Button ist selektiert
  16166.       ENDIF
  16167.     NEXT i&
  16168.     '
  16169.   ELSE                       ! Radio-Button suchen...
  16170.     FOR i&=0 TO anz&
  16171.       IF BTST(OB_STATE(rsc_adr%(tree&),obj&(i&)),0)
  16172.         RETURN i&            ! ...selektierter zurück
  16173.       ENDIF
  16174.     NEXT i&
  16175.     '
  16176.   ENDIF
  16177.   '
  16178.   RETURN -1                  ! Kein Button selektiert
  16179. ENDFUNC
  16180. ' ------------------------------------------------------------------------------
  16181. ' Gibt die Anzahl der Maustastendrücke (1 oder 2) zurück, mit denen ein Dialog
  16182. ' verlassen wurde und maskiert das Bit 15 wieder aus...
  16183. '
  16184. > FUNCTION rsc_clicks(VAR rsc&)
  16185.   $F%
  16186.   LOCAL mc&
  16187.   '
  16188.   mc&=BTST(rsc&,15)                                  ! Doppelklick?
  16189.   IF mc&
  16190.     rsc&=AND(rsc&,&X111111111111111)                 ! Bit 15 ausmaskieren
  16191.   ENDIF
  16192.   '
  16193.   RETURN 1-mc&
  16194. ENDFUNC
  16195. ' ------------------------------------------------------------------------------
  16196. ' GET/PUT-Ersatz auf Basis des im INLINE integrierten BITBLT
  16197. '
  16198. > FUNCTION rsc_get(x&,y&,w&,h&)
  16199.   LOCAL a%
  16200.   '
  16201.   a%=ADD(@getsize(w&,h&),4)          ! Speicherbedarf
  16202.   a%=MALLOC(a%)                      ! Speicher anfordern
  16203.   '
  16204.   IF a%                              ! Hat geklappt...
  16205.     INT{a%}=w&                       ! Breite eintragen
  16206.     INT{ADD(a%,2)}=h&                ! Höhe
  16207.     '                                ! Kopieren...
  16208.     ~C:rsc_bitblt%(L:0,0,0,0,planes&,L:ADD(a%,4),w&,h&,0,planes&,x&,y&,w&,h&,0,0,1)
  16209.   ENDIF
  16210.   '
  16211.   RETURN a%                          ! Adresse zurück
  16212. ENDFUNC
  16213. > PROCEDURE rsc_put(a%,x&,y&,m&)
  16214.   LOCAL w&,h&
  16215.   '
  16216.   IF a%                              ! Gibt's den Block überhaupt...
  16217.     w&=INT{a%}                       ! Breite holen
  16218.     h&=INT{ADD(a%,2)}                ! Höhe
  16219.     '
  16220.     ~GRAF_MOUSE(256,0)               ! Hidem
  16221.     ~C:rsc_bitblt%(L:ADD(a%,4),w&,h&,0,planes&,L:0,0,0,0,planes&,0,0,w&,h&,x&,y&,m&)
  16222.     ~GRAF_MOUSE(257,0)               ! Showm
  16223.     '
  16224.   ENDIF
  16225.   '
  16226. RETURN
  16227. ' ------------------------------------------------------------------------------
  16228. ' Eine Busy-Maus in der Form eines kleines Balles...
  16229. '
  16230. ' ## INLINE:
  16231. ' $0000: 00 00 00 00 00 01 00 00 00 01 0f f0 3f fc 7f fe 
  16232. ' $0010: 7f fe ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
  16233. ' $0020: ff ff 7f fe 7f fe 3f fc 0f f0 00 00 07 e0 18 f8 
  16234. ' $0030: 20 fc 20 fc 40 fe 40 fe 40 fe 7f 02 7f 02 7f 06 
  16235. ' $0040: 3f 04 3f 0c 1f 18 07 e0 00 00 00 00 00 00 00 01 
  16236. ' $0050: 00 00 00 01 0f f0 3f fc 7f fe 7f fe ff ff ff ff 
  16237. ' $0060: ff ff ff ff ff ff ff ff ff ff ff ff 7f fe 7f fe 
  16238. ' $0070: 3f fc 0f f0 00 00 07 e0 18 18 20 1c 20 3c 70 3e 
  16239. ' $0080: 7c 7e 7f fe 7f fe 7e 3e 7c 0e 3c 04 38 04 18 18 
  16240. ' $0090: 07 e0 00 00 00 00 00 00 00 01 00 00 00 01 0f f0 
  16241. ' $00a0: 3f fc 7f fe 7f fe ff ff ff ff ff ff ff ff ff ff 
  16242. ' $00b0: ff ff ff ff ff ff 7f fe 7f fe 3f fc 0f f0 00 00 
  16243. ' $00c0: 07 e0 18 18 30 0c 38 1c 7c 3e 7e 7e 7f fe 7f fe 
  16244. ' $00d0: 7e 7e 7c 3e 38 1c 30 0c 18 18 07 e0 00 00 00 00 
  16245. ' $00e0: 00 00 00 01 00 00 00 01 0f f0 3f fc 7f fe 7f fe 
  16246. ' $00f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
  16247. ' $0100: 7f fe 7f fe 3f fc 0f f0 00 00 07 e0 18 18 38 04 
  16248. ' $0110: 3c 04 7c 0e 7e 3e 7f fe 7f fe 7c 7e 70 3e 20 3c 
  16249. ' $0120: 20 1c 18 18 07 e0 00 00 00 00 00 00 00 01 00 00 
  16250. ' $0130: 00 01 0f f0 3f fc 7f fe 7f fe ff ff ff ff ff ff 
  16251. ' $0140: ff ff ff ff ff ff ff ff ff ff 7f fe 7f fe 3f fc 
  16252. ' $0150: 0f f0 00 00 07 e0 1f 18 3f 0c 3f 04 7f 06 7f 02 
  16253. ' $0160: 7f 02 40 fe 40 fe 40 fe 20 fc 20 fc 18 f8 07 e0 
  16254. ' $0170: 00 00 00 00 00 00 00 01 00 00 00 01 0f f0 3f fc 
  16255. ' $0180: 7f fe 7f fe ff ff ff ff ff ff ff ff ff ff ff ff 
  16256. ' $0190: ff ff ff ff 7f fe 7f fe 3f fc 0f f0 00 00 07 e0 
  16257. ' $01a0: 1f f8 3f e4 3f c4 5f c2 47 82 41 82 41 82 41 e2 
  16258. ' $01b0: 43 fa 23 fc 27 fc 1f f8 07 e0 00 00 00 00 00 00 
  16259. ' $01c0: 00 01 00 00 00 01 0f f0 3f fc 7f fe 7f fe ff ff 
  16260. ' $01d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff 7f fe 
  16261. ' $01e0: 7f fe 3f fc 0f f0 00 00 07 e0 1f f8 3f fc 2f f4 
  16262. ' $01f0: 47 e2 43 c2 41 82 41 82 43 c2 47 e2 2f f4 3f fc 
  16263. ' $0200: 1f f8 07 e0 00 00 00 00 00 00 00 01 00 00 00 01 
  16264. ' $0210: 0f f0 3f fc 7f fe 7f fe ff ff ff ff ff ff ff ff 
  16265. ' $0220: ff ff ff ff ff ff ff ff 7f fe 7f fe 3f fc 0f f0 
  16266. ' $0230: 00 00 07 e0 1f f8 27 fc 23 fc 43 fa 41 e2 41 82 
  16267. ' $0240: 41 82 47 82 5f c2 3f c4 3f e4 1f f8 07 e0 00 00 
  16268. ' 592  Bytes.
  16269. INLINE m_busy%,592
  16270. m_adr%=m_busy%
  16271. '
  16272. > PROCEDURE busy_mouse
  16273.   '
  16274.   IF m_adr%=ADD(m_busy%,518)
  16275.     m_adr%=m_busy%
  16276.     '
  16277.   ELSE
  16278.     ADD m_adr%,74
  16279.   ENDIF
  16280.   '
  16281.   ~GRAF_MOUSE(255,m_adr%)
  16282.   '
  16283. RETURN
  16284. ' ------------------------------------------------------------------------------
  16285. ' **********************************************************************
  16286. > PROCEDURE init_hnumbers_1
  16287.   REM Resource Datei Indizes für GELDHER1
  16288.   LET h_menu&=0 ! Menuebaum
  16289.   LET desk&=3 ! TITLE in Baum H_MENU
  16290.   LET datei&=4 ! TITLE in Baum H_MENU
  16291.   LET mahnverf&=5 ! TITLE in Baum H_MENU
  16292.   LET standard&=6 ! TITLE in Baum H_MENU
  16293.   LET extras&=7 ! TITLE in Baum H_MENU
  16294.   LET rastinfo&=10 ! STRING in Baum H_MENU
  16295.   LET dneuabrg&=19 ! STRING in Baum H_MENU
  16296.   LET dabrerg&=21 ! STRING in Baum H_MENU
  16297.   LET dzeiloe&=22 ! STRING in Baum H_MENU
  16298.   LET dladen&=23 ! STRING in Baum H_MENU
  16299.   LET ddazulad&=24 ! STRING in Baum H_MENU
  16300.   LET dspeich&=25 ! STRING in Baum H_MENU
  16301.   LET dkurzdr&=26 ! STRING in Baum H_MENU
  16302.   LET dzvdruck&=27 ! STRING in Baum H_MENU
  16303.   LET dende&=29 ! STRING in Baum H_MENU
  16304.   LET mmb&=31 ! STRING in Baum H_MENU
  16305.   LET mvb&=32 ! STRING in Baum H_MENU
  16306.   LET mcommb&=33 ! STRING in Baum H_MENU
  16307.   LET mvoreinst&=35 ! STRING in Baum H_MENU
  16308.   LET mmbmuster&=37 ! STRING in Baum H_MENU
  16309.   LET mstandardmb&=38 ! STRING in Baum H_MENU
  16310.   LET mcmbmuster&=39 ! STRING in Baum H_MENU
  16311.   LET mstandardcmb&=40 ! STRING in Baum H_MENU
  16312.   LET skopien&=42 ! STRING in Baum H_MENU
  16313.   LET sfkey&=43 ! STRING in Baum H_MENU
  16314.   LET sformula&=44 ! STRING in Baum H_MENU
  16315.   LET sstdadr&=45 ! STRING in Baum H_MENU
  16316.   LET svoreins&=46 ! STRING in Baum H_MENU
  16317.   LET sdiskont&=47 ! STRING in Baum H_MENU
  16318.   LET sspeicher&=48 ! STRING in Baum H_MENU
  16319.   LET edatenbank&=50 ! STRING in Baum H_MENU
  16320.   LET edbdazuladen&=51 ! STRING in Baum H_MENU
  16321.   LET ezinsre&=52 ! STRING in Baum H_MENU
  16322.   LET egebrechner&=53 ! STRING in Baum H_MENU
  16323.   LET eordner&=54 ! STRING in Baum H_MENU
  16324.   LET edatloes&=55 ! STRING in Baum H_MENU
  16325.   LET edialpos&=56 ! STRING in Baum H_MENU
  16326.   LET edrckanp&=57 ! STRING in Baum H_MENU
  16327.   LET edruckport&=58 ! STRING in Baum H_MENU
  16328.   LET eoverlay&=59 ! STRING in Baum H_MENU
  16329.   LET edrcktst&=60 ! STRING in Baum H_MENU
  16330.   LET edateikonvert&=61 ! STRING in Baum H_MENU
  16331.   LET popupbaum&=1 ! Formular/Dialog
  16332.   LET titelarten&=1 ! BOX in Baum POPUPBAUM
  16333.   LET fdgarten&=11 ! BOX in Baum POPUPBAUM
  16334.   LET fdgpop1&=12 ! STRING in Baum POPUPBAUM
  16335.   LET mbarten&=22 ! BOX in Baum POPUPBAUM
  16336.   LET adresspopup&=27 ! BOX in Baum POPUPBAUM
  16337.   LET druckziele&=34 ! BOX in Baum POPUPBAUM
  16338.   LET ziel1&=35 ! STRING in Baum POPUPBAUM
  16339.   LET canredenpopup1&=39 ! BOX in Baum POPUPBAUM
  16340.   LET canredepopup3&=43 ! BOX in Baum POPUPBAUM
  16341.   LET cmbanredenpopup3&=45 ! STRING in Baum POPUPBAUM
  16342.   LET cprozbevpopup&=47 ! BOX in Baum POPUPBAUM
  16343.   LET cgerichtpopup&=55 ! BOX in Baum POPUPBAUM
  16344.   LET czinspopup1&=63 ! BOX in Baum POPUPBAUM
  16345.   LET alertbaum&=2 ! Formular/Dialog
  16346.   LET azbaum&=3 ! Formular/Dialog
  16347.   LET az&=3 ! FTEXT in Baum AZBAUM
  16348.   LET perdatum&=5 ! FTEXT in Baum AZBAUM
  16349.   LET fertig18&=6 ! BUTTON in Baum AZBAUM
  16350.   LET abbruc18&=7 ! BUTTON in Baum AZBAUM
  16351.   LET falldatenbaum&=4 ! Formular/Dialog
  16352.   LET glname&=4 ! FTEXT in Baum FALLDATENBAUM
  16353.   LET gldb&=5 ! BUTTON in Baum FALLDATENBAUM
  16354.   LET glstr&=6 ! FTEXT in Baum FALLDATENBAUM
  16355.   LET glort&=7 ! FTEXT in Baum FALLDATENBAUM
  16356.   LET glgf&=8 ! FTEXT in Baum FALLDATENBAUM
  16357.   LET schname&=10 ! FTEXT in Baum FALLDATENBAUM
  16358.   LET schdb&=11 ! BUTTON in Baum FALLDATENBAUM
  16359.   LET schstr&=12 ! FTEXT in Baum FALLDATENBAUM
  16360.   LET schort&=13 ! FTEXT in Baum FALLDATENBAUM
  16361.   LET schgf&=14 ! FTEXT in Baum FALLDATENBAUM
  16362.   LET artpop&=16 ! STRING in Baum FALLDATENBAUM
  16363.   LET titelpop&=17 ! BOXTEXT in Baum FALLDATENBAUM
  16364.   LET titelcircle&=18 ! BOXCHAR in Baum FALLDATENBAUM
  16365.   LET gericht&=19 ! FTEXT in Baum FALLDATENBAUM
  16366.   LET gerort&=20 ! FTEXT in Baum FALLDATENBAUM
  16367.   LET datumtit&=21 ! FTEXT in Baum FALLDATENBAUM
  16368.   LET azgerich&=22 ! FTEXT in Baum FALLDATENBAUM
  16369.   LET fertig5&=23 ! BUTTON in Baum FALLDATENBAUM
  16370.   LET abbruch5&=24 ! BUTTON in Baum FALLDATENBAUM
  16371.   LET buchungsbaum&=5 ! Formular/Dialog
  16372.   LET zeilback&=4 ! BUTTON in Baum BUCHUNGSBAUM
  16373.   LET zeilnr&=5 ! BOXTEXT in Baum BUCHUNGSBAUM
  16374.   LET zeilforw&=6 ! BUTTON in Baum BUCHUNGSBAUM
  16375.   LET fdgart&=7 ! BUTTON in Baum BUCHUNGSBAUM
  16376.   LET hptfdg&=8 ! BUTTON in Baum BUCHUNGSBAUM
  16377.   LET kfb&=9 ! BUTTON in Baum BUCHUNGSBAUM
  16378.   LET kostmb&=10 ! BUTTON in Baum BUCHUNGSBAUM
  16379.   LET kostvb&=11 ! BUTTON in Baum BUCHUNGSBAUM
  16380.   LET zva&=12 ! BUTTON in Baum BUCHUNGSBAUM
  16381.   LET pfueb&=13 ! BUTTON in Baum BUCHUNGSBAUM
  16382.   LET evantr&=14 ! BUTTON in Baum BUCHUNGSBAUM
  16383.   LET gvnn&=15 ! BUTTON in Baum BUCHUNGSBAUM
  16384.   LET ema&=16 ! BUTTON in Baum BUCHUNGSBAUM
  16385.   LET panfr&=17 ! BUTTON in Baum BUCHUNGSBAUM
  16386.   LET hranfr&=18 ! BUTTON in Baum BUCHUNGSBAUM
  16387.   LET gewanfr&=19 ! BUTTON in Baum BUCHUNGSBAUM
  16388.   LET auslagen&=20 ! BUTTON in Baum BUCHUNGSBAUM
  16389.   LET nebenfdg&=21 ! BUTTON in Baum BUCHUNGSBAUM
  16390.   LET zhlgsch&=22 ! BUTTON in Baum BUCHUNGSBAUM
  16391.   LET zhlgdsch&=23 ! BUTTON in Baum BUCHUNGSBAUM
  16392.   LET fdgartpop&=24 ! FBOXTEXT in Baum BUCHUNGSBAUM
  16393.   LET fdgartcircle&=25 ! BOXCHAR in Baum BUCHUNGSBAUM
  16394.   LET fdgdat&=27 ! FTEXT in Baum BUCHUNGSBAUM
  16395.   LET betrag&=28 ! FTEXT in Baum BUCHUNGSBAUM
  16396.   LET bzinsbox&=29 ! BUTTON in Baum BUCHUNGSBAUM
  16397.   LET zinssatz&=30 ! FTEXT in Baum BUCHUNGSBAUM
  16398.   LET bscheckz&=32 ! BUTTON in Baum BUCHUNGSBAUM
  16399.   LET zinsdat&=33 ! FTEXT in Baum BUCHUNGSBAUM
  16400.   LET bzinszust&=34 ! BUTTON in Baum BUCHUNGSBAUM
  16401.   LET weiterb&=35 ! BUTTON in Baum BUCHUNGSBAUM
  16402.   LET ok&=36 ! BUTTON in Baum BUCHUNGSBAUM
  16403.   LET abbruch&=37 ! BUTTON in Baum BUCHUNGSBAUM
  16404.   LET druckoptbaum&=6 ! Formular/Dialog
  16405.   LET d367&=4 ! BUTTON in Baum DRUCKOPTBAUM
  16406.   LET dpfueb&=5 ! BUTTON in Baum DRUCKOPTBAUM
  16407.   LET deva&=6 ! BUTTON in Baum DRUCKOPTBAUM
  16408.   LET dandrohg&=7 ! BUTTON in Baum DRUCKOPTBAUM
  16409.   LET d840zpo&=8 ! BUTTON in Baum DRUCKOPTBAUM
  16410.   LET deverg&=9 ! BUTTON in Baum DRUCKOPTBAUM
  16411.   LET dzva&=10 ! BUTTON in Baum DRUCKOPTBAUM
  16412.   LET dsihyp&=11 ! BUTTON in Baum DRUCKOPTBAUM
  16413.   LET devneu&=12 ! BUTTON in Baum DRUCKOPTBAUM
  16414.   LET ddurchs&=13 ! BUTTON in Baum DRUCKOPTBAUM
  16415.   LET dsivstr&=14 ! BUTTON in Baum DRUCKOPTBAUM
  16416.   LET dverhaft&=15 ! BUTTON in Baum DRUCKOPTBAUM
  16417.   LET dzahlver&=16 ! BUTTON in Baum DRUCKOPTBAUM
  16418.   LET dema&=17 ! BUTTON in Baum DRUCKOPTBAUM
  16419.   LET dpfverh&=18 ! BUTTON in Baum DRUCKOPTBAUM
  16420.   LET dgeladen&=19 ! BUTTON in Baum DRUCKOPTBAUM
  16421.   LET dratenvg&=20 ! BUTTON in Baum DRUCKOPTBAUM
  16422.   LET dpanfrag&=21 ! BUTTON in Baum DRUCKOPTBAUM
  16423.   LET dladedatei&=22 ! TEXT in Baum DRUCKOPTBAUM
  16424.   LET mitgebue&=23 ! BUTTON in Baum DRUCKOPTBAUM
  16425.   LET mitmwst&=24 ! BUTTON in Baum DRUCKOPTBAUM
  16426.   LET dteilvollstrckg&=25 ! BUTTON in Baum DRUCKOPTBAUM
  16427.   LET dteilbetraghoehe&=26 ! FTEXT in Baum DRUCKOPTBAUM
  16428.   LET dglaeubigerzahl&=27 ! FTEXT in Baum DRUCKOPTBAUM
  16429.   LET dausgang&=28 ! BUTTON in Baum DRUCKOPTBAUM
  16430.   LET dabbruch&=29 ! BUTTON in Baum DRUCKOPTBAUM
  16431.   LET adressbaum&=7 ! Formular/Dialog
  16432.   LET wessadr&=3 ! STRING in Baum ADRESSBAUM
  16433.   LET anrede1&=4 ! FTEXT in Baum ADRESSBAUM
  16434.   LET anrede2button&=5 ! STRING in Baum ADRESSBAUM
  16435.   LET anrede2&=6 ! FBOXTEXT in Baum ADRESSBAUM
  16436.   LET anrede2cycle&=7 ! BOXCHAR in Baum ADRESSBAUM
  16437.   LET strasse&=8 ! FTEXT in Baum ADRESSBAUM
  16438.   LET ort&=9 ! FTEXT in Baum ADRESSBAUM
  16439.   LET vertr&=10 ! STRING in Baum ADRESSBAUM
  16440.   LET gf1&=11 ! FTEXT in Baum ADRESSBAUM
  16441.   LET gf2&=12 ! FTEXT in Baum ADRESSBAUM
  16442.   LET fertig8&=13 ! BUTTON in Baum ADRESSBAUM
  16443.   LET abbruch8&=14 ! BUTTON in Baum ADRESSBAUM
  16444.   LET adressdb&=15 ! BUTTON in Baum ADRESSBAUM
  16445.   LET pfuebbaum&=8 ! Formular/Dialog
  16446.   LET dsaa&=4 ! BUTTON in Baum PFUEBBAUM
  16447.   LET dsag&=5 ! BUTTON in Baum PFUEBBAUM
  16448.   LET dsbank&=6 ! BUTTON in Baum PFUEBBAUM
  16449.   LET dsfa&=7 ! BUTTON in Baum PFUEBBAUM
  16450.   LET dslv&=8 ! BUTTON in Baum PFUEBBAUM
  16451.   LET dsrente&=9 ! BUTTON in Baum PFUEBBAUM
  16452.   LET dswerk&=10 ! BUTTON in Baum PFUEBBAUM
  16453.   LET dsandere&=11 ! BUTTON in Baum PFUEBBAUM
  16454.   LET dsladen&=12 ! BUTTON in Baum PFUEBBAUM
  16455.   LET dsfertig&=13 ! BUTTON in Baum PFUEBBAUM
  16456.   LET dsabbruc&=14 ! BUTTON in Baum PFUEBBAUM
  16457.   LET besanwbaum&=9 ! Formular/Dialog
  16458.   LET zusatz01&=3 ! FTEXT in Baum BESANWBAUM
  16459.   LET zusatz02&=4 ! FTEXT in Baum BESANWBAUM
  16460.   LET zusatz03&=5 ! FTEXT in Baum BESANWBAUM
  16461.   LET zusatz04&=6 ! FTEXT in Baum BESANWBAUM
  16462.   LET zusatz05&=7 ! FTEXT in Baum BESANWBAUM
  16463.   LET zusatz06&=8 ! FTEXT in Baum BESANWBAUM
  16464.   LET zusatz07&=9 ! FTEXT in Baum BESANWBAUM
  16465.   LET zusatz08&=10 ! FTEXT in Baum BESANWBAUM
  16466.   LET zusatz09&=11 ! FTEXT in Baum BESANWBAUM
  16467.   LET zusatz10&=12 ! FTEXT in Baum BESANWBAUM
  16468.   LET zusatz11&=13 ! FTEXT in Baum BESANWBAUM
  16469.   LET zusatz12&=14 ! FTEXT in Baum BESANWBAUM
  16470.   LET anzkop&=15 ! FTEXT in Baum BESANWBAUM
  16471.   LET zieloption&=17 ! STRING in Baum BESANWBAUM
  16472.   LET zielpop&=18 ! FBOXTEXT in Baum BESANWBAUM
  16473.   LET zielcircle&=19 ! BOXCHAR in Baum BESANWBAUM
  16474.   LET copystop&=20 ! BUTTON in Baum BESANWBAUM
  16475.   LET zusatzok&=21 ! BUTTON in Baum BESANWBAUM
  16476.   LET zusatzab&=22 ! BUTTON in Baum BESANWBAUM
  16477.   LET zustdatumbaum&=10 ! Formular/Dialog
  16478.   LET zustelldatum&=6 ! FTEXT in Baum ZUSTDATUMBAUM
  16479.   LET erlassvbdatum&=7 ! FTEXT in Baum ZUSTDATUMBAUM
  16480.   LET zustok&=8 ! BUTTON in Baum ZUSTDATUMBAUM
  16481.   LET zustabbruch&=9 ! BUTTON in Baum ZUSTDATUMBAUM
  16482.   LET mbauswahlbaum&=11 ! Formular/Dialog
  16483.   LET mbastandard&=4 ! BUTTON in Baum MBAUSWAHLBAUM
  16484.   LET mbaladen&=5 ! BUTTON in Baum MBAUSWAHLBAUM
  16485.   LET mbaaktaufst&=6 ! BUTTON in Baum MBAUSWAHLBAUM
  16486.   LET mbanichtaendern&=7 ! BUTTON in Baum MBAUSWAHLBAUM
  16487.   LET mbambplus367&=9 ! BUTTON in Baum MBAUSWAHLBAUM
  16488.   LET mbadazubuchen&=10 ! BUTTON in Baum MBAUSWAHLBAUM
  16489.   LET mbanichtbuchen&=11 ! BUTTON in Baum MBAUSWAHLBAUM
  16490.   LET mbaok&=12 ! BUTTON in Baum MBAUSWAHLBAUM
  16491.   LET mbaabbruch&=13 ! BUTTON in Baum MBAUSWAHLBAUM
  16492.   LET mbbaum1&=12 ! Formular/Dialog
  16493.   LET mb1ueberschrift&=2 ! STRING in Baum MBBAUM1
  16494.   LET aszahl&=3 ! FTEXT in Baum MBBAUM1
  16495.   LET agzahl&=4 ! FTEXT in Baum MBBAUM1
  16496.   LET mahngericht&=7 ! FTEXT in Baum MBBAUM1
  16497.   LET ag1&=9 ! FTEXT in Baum MBBAUM1
  16498.   LET mbuebernahmeag&=11 ! TEXT in Baum MBBAUM1
  16499.   LET ag2&=12 ! FTEXT in Baum MBBAUM1
  16500.   LET ag3&=13 ! FTEXT in Baum MBBAUM1
  16501.   LET ag4&=14 ! FTEXT in Baum MBBAUM1
  16502.   LET ag5&=15 ! FTEXT in Baum MBBAUM1
  16503.   LET ag6&=16 ! FTEXT in Baum MBBAUM1
  16504.   LET ag7&=17 ! FTEXT in Baum MBBAUM1
  16505.   LET ag8&=18 ! FTEXT in Baum MBBAUM1
  16506.   LET mbartbutton&=19 ! STRING in Baum MBBAUM1
  16507.   LET mbartpopup&=20 ! FBOXTEXT in Baum MBBAUM1
  16508.   LET mbartcycle&=21 ! BOXCHAR in Baum MBBAUM1
  16509.   LET as1&=23 ! FTEXT in Baum MBBAUM1
  16510.   LET mbasdb&=26 ! TEXT in Baum MBBAUM1
  16511.   LET mbuebernahmeas&=27 ! TEXT in Baum MBBAUM1
  16512.   LET as2&=28 ! FTEXT in Baum MBBAUM1
  16513.   LET as3&=29 ! FTEXT in Baum MBBAUM1
  16514.   LET as4&=30 ! FTEXT in Baum MBBAUM1
  16515.   LET as5&=31 ! FTEXT in Baum MBBAUM1
  16516.   LET gesschuld&=34 ! BUTTON in Baum MBBAUM1
  16517.   LET gesschuldner1&=35 ! FTEXT in Baum MBBAUM1
  16518.   LET gesschuldner2&=36 ! FTEXT in Baum MBBAUM1
  16519.   LET mb1ok&=39 ! BUTTON in Baum MBBAUM1
  16520.   LET mb1abbruch&=40 ! BUTTON in Baum MBBAUM1
  16521.   LET mbagdb&=41 ! TEXT in Baum MBBAUM1
  16522.   LET mbbaum2&=13 ! Formular/Dialog
  16523.   LET mb2ueberschrift&=2 ! STRING in Baum MBBAUM2
  16524.   LET mbhfdatum&=5 ! FTEXT in Baum MBBAUM2
  16525.   LET mbaz&=6 ! FTEXT in Baum MBBAUM2
  16526.   LET anspruch1&=8 ! FTEXT in Baum MBBAUM2
  16527.   LET anspruch2&=9 ! FTEXT in Baum MBBAUM2
  16528.   LET anspruch3&=10 ! FTEXT in Baum MBBAUM2
  16529.   LET anspruch4&=11 ! FTEXT in Baum MBBAUM2
  16530.   LET anspruch5&=12 ! FTEXT in Baum MBBAUM2
  16531.   LET mbhf&=16 ! STRING in Baum MBBAUM2
  16532.   LET hauptforderung&=17 ! FTEXT in Baum MBBAUM2
  16533.   LET mbzins&=21 ! FTEXT in Baum MBBAUM2
  16534.   LET mbueberdiskont&=23 ! BUTTON in Baum MBBAUM2
  16535.   LET mbzinsdat&=24 ! FTEXT in Baum MBBAUM2
  16536.   LET mbzinszustellg&=25 ! BUTTON in Baum MBBAUM2
  16537.   LET zinsen1&=26 ! FTEXT in Baum MBBAUM2
  16538.   LET zinsen2&=27 ! FTEXT in Baum MBBAUM2
  16539.   LET mbnf&=30 ! STRING in Baum MBBAUM2
  16540.   LET nebenforderung&=31 ! FTEXT in Baum MBBAUM2
  16541.   LET mbkosten&=36 ! FTEXT in Baum MBBAUM2
  16542.   LET mbgk&=38 ! FTEXT in Baum MBBAUM2
  16543.   LET mbauslagenast&=41 ! FTEXT in Baum MBBAUM2
  16544.   LET mbgebuehren&=44 ! FTEXT in Baum MBBAUM2
  16545.   LET westost&=45 ! FTEXT in Baum MBBAUM2
  16546.   LET mbauslagenpv&=47 ! FTEXT in Baum MBBAUM2
  16547.   LET mbmwstpv&=50 ! FTEXT in Baum MBBAUM2
  16548.   LET mbsumme&=53 ! FTEXT in Baum MBBAUM2
  16549.   LET ohneggleistg&=56 ! BUTTON in Baum MBBAUM2
  16550.   LET ggleistgerbracht&=57 ! BUTTON in Baum MBBAUM2
  16551.   LET streitgericht&=60 ! FTEXT in Baum MBBAUM2
  16552.   LET mbstreitgdb&=61 ! STRING in Baum MBBAUM2
  16553.   LET pv1&=64 ! FTEXT in Baum MBBAUM2
  16554.   LET pv2&=65 ! FTEXT in Baum MBBAUM2
  16555.   LET pv3&=66 ! FTEXT in Baum MBBAUM2
  16556.   LET pv4&=67 ! FTEXT in Baum MBBAUM2
  16557.   LET pv5&=68 ! FTEXT in Baum MBBAUM2
  16558.   LET pv6&=69 ! FTEXT in Baum MBBAUM2
  16559.   LET pv7&=70 ! FTEXT in Baum MBBAUM2
  16560.   LET pv8&=71 ! FTEXT in Baum MBBAUM2
  16561.   LET mbort&=73 ! FTEXT in Baum MBBAUM2
  16562.   LET mbstreitverf&=78 ! BUTTON in Baum MBBAUM2
  16563.   LET mbvollmacht&=79 ! BUTTON in Baum MBBAUM2
  16564.   LET mbvorsteuer&=80 ! BUTTON in Baum MBBAUM2
  16565.   LET mb2ok&=81 ! BUTTON in Baum MBBAUM2
  16566.   LET mb2zurueck&=82 ! BUTTON in Baum MBBAUM2
  16567.   LET mb2abbruch&=83 ! BUTTON in Baum MBBAUM2
  16568.   LET cmbantragstlbaum&=14 ! Formular/Dialog
  16569.   LET caaz&=3 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16570.   LET caanredepopup1&=6 ! BOXTEXT in Baum CMBANTRAGSTLBAUM
  16571.   LET cauebernahme1&=8 ! STRING in Baum CMBANTRAGSTLBAUM
  16572.   LET cavorname1&=10 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16573.   LET canachname1&=12 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16574.   LET castrasse1&=14 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16575.   LET caplz1&=18 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16576.   LET caort1&=19 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16577.   LET caauslkz1&=20 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16578.   LET caanredepopup2&=23 ! BOXTEXT in Baum CMBANTRAGSTLBAUM
  16579.   LET cauebernahme2&=25 ! STRING in Baum CMBANTRAGSTLBAUM
  16580.   LET cavorname2&=27 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16581.   LET canachname2&=29 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16582.   LET castrasse2&=31 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16583.   LET caplz2&=35 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16584.   LET caort2&=36 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16585.   LET caauslkz2&=37 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16586.   LET cafirmenpopup&=40 ! BOXTEXT in Baum CMBANTRAGSTLBAUM
  16587.   LET casonstigefirma&=43 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16588.   LET cauebernahme3&=45 ! STRING in Baum CMBANTRAGSTLBAUM
  16589.   LET cafirmenname1&=46 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16590.   LET cafirmenname2&=48 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16591.   LET cafirmenstrasse&=53 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16592.   LET cafirmenplz&=54 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16593.   LET cafirmenort&=55 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16594.   LET cafirmaauslkz&=56 ! FTEXT in Baum CMBANTRAGSTLBAUM
  16595.   LET cagesetzvertr&=57 ! BUTTON in Baum CMBANTRAGSTLBAUM
  16596.   LET caprozessbevollm&=58 ! BUTTON in Baum CMBANTRAGSTLBAUM
  16597.   LET caok&=59 ! BUTTON in Baum CMBANTRAGSTLBAUM
  16598.   LET caabbruch&=60 ! BUTTON in Baum CMBANTRAGSTLBAUM
  16599.   LET cmbantragsggbaum&=15 ! Formular/Dialog
  16600.   LET cganredepopup1&=5 ! BOXTEXT in Baum CMBANTRAGSGGBAUM
  16601.   LET cguebernahme1&=7 ! STRING in Baum CMBANTRAGSGGBAUM
  16602.   LET cgvorname1&=9 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16603.   LET cgnachname1&=11 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16604.   LET cgstrasse1&=13 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16605.   LET cgplz1&=16 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16606.   LET cgort1&=17 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16607.   LET cganredepopup2&=20 ! BOXTEXT in Baum CMBANTRAGSGGBAUM
  16608.   LET cguebernahme2&=22 ! STRING in Baum CMBANTRAGSGGBAUM
  16609.   LET cgvorname2&=24 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16610.   LET cgnachname2&=26 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16611.   LET cgstrasse2&=28 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16612.   LET cgplz2&=31 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16613.   LET cgort2&=32 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16614.   LET cgfirmenpopup&=35 ! BOXTEXT in Baum CMBANTRAGSGGBAUM
  16615.   LET cgsonstigefirma&=38 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16616.   LET cguebernahme3&=40 ! STRING in Baum CMBANTRAGSGGBAUM
  16617.   LET cgfirmenname1&=41 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16618.   LET cgfirmenname2&=43 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16619.   LET cgfirmenstrasse&=47 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16620.   LET cgfirmenplz&=48 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16621.   LET cgfirmenort&=49 ! FTEXT in Baum CMBANTRAGSGGBAUM
  16622.   LET cggesamtschuld&=50 ! BUTTON in Baum CMBANTRAGSGGBAUM
  16623.   LET cggesetzvertr&=51 ! BUTTON in Baum CMBANTRAGSGGBAUM
  16624.   LET cgok&=52 ! BUTTON in Baum CMBANTRAGSGGBAUM
  16625.   LET cgabbruch&=53 ! BUTTON in Baum CMBANTRAGSGGBAUM
  16626.   LET cmbvertreterbaum&=16 ! Formular/Dialog
  16627.   LET cvspalte1&=5 ! FTEXT in Baum CMBVERTRETERBAUM
  16628.   LET cvstellung1&=7 ! FTEXT in Baum CMBVERTRETERBAUM
  16629.   LET cvvornachname1&=9 ! FTEXT in Baum CMBVERTRETERBAUM
  16630.   LET cvstrasse1&=11 ! FTEXT in Baum CMBVERTRETERBAUM
  16631.   LET cvplz1&=15 ! FTEXT in Baum CMBVERTRETERBAUM
  16632.   LET cvort1&=16 ! FTEXT in Baum CMBVERTRETERBAUM
  16633.   LET cvauslkz1&=17 ! FTEXT in Baum CMBVERTRETERBAUM
  16634.   LET cvspalte2&=20 ! FTEXT in Baum CMBVERTRETERBAUM
  16635.   LET cvstellung2&=22 ! FTEXT in Baum CMBVERTRETERBAUM
  16636.   LET cvvornachname2&=24 ! FTEXT in Baum CMBVERTRETERBAUM
  16637.   LET cvstrasse2&=26 ! FTEXT in Baum CMBVERTRETERBAUM
  16638.   LET cvplz2&=30 ! FTEXT in Baum CMBVERTRETERBAUM
  16639.   LET cvort2&=31 ! FTEXT in Baum CMBVERTRETERBAUM
  16640.   LET cvauslkz2&=32 ! FTEXT in Baum CMBVERTRETERBAUM
  16641.   LET cvok&=33 ! BUTTON in Baum CMBVERTRETERBAUM
  16642.   LET cvabbruch&=34 ! BUTTON in Baum CMBVERTRETERBAUM
  16643.   LET cmbprozbevbaum&=17 ! Formular/Dialog
  16644.   LET cpanredepopup&=5 ! BOXTEXT in Baum CMBPROZBEVBAUM
  16645.   LET cpauslagen&=8 ! FTEXT in Baum CMBPROZBEVBAUM
  16646.   LET cpuebernahme&=9 ! STRING in Baum CMBPROZBEVBAUM
  16647.   LET cpvornachname&=12 ! FTEXT in Baum CMBPROZBEVBAUM
  16648.   LET cpstrasse&=17 ! FTEXT in Baum CMBPROZBEVBAUM
  16649.   LET cpplz&=18 ! FTEXT in Baum CMBPROZBEVBAUM
  16650.   LET cport&=19 ! FTEXT in Baum CMBPROZBEVBAUM
  16651.   LET cpauslkz&=20 ! FTEXT in Baum CMBPROZBEVBAUM
  16652.   LET cpblz&=24 ! FTEXT in Baum CMBPROZBEVBAUM
  16653.   LET cpkonto&=25 ! FTEXT in Baum CMBPROZBEVBAUM
  16654.   LET cpbank&=26 ! FTEXT in Baum CMBPROZBEVBAUM
  16655.   LET cpok&=27 ! BUTTON in Baum CMBPROZBEVBAUM
  16656.   LET cpabbruch&=28 ! BUTTON in Baum CMBPROZBEVBAUM
  16657.   LET cmbforderungbaum&=18 ! Formular/Dialog
  16658.   LET cfkatalognr1&=11 ! FTEXT in Baum CMBFORDERUNGBAUM
  16659.   LET cfrechtsgrund1&=12 ! FTEXT in Baum CMBFORDERUNGBAUM
  16660.   LET cfrechnungsnr1&=13 ! FTEXT in Baum CMBFORDERUNGBAUM
  16661.   LET cfabdatum1&=14 ! FTEXT in Baum CMBFORDERUNGBAUM
  16662.   LET cfbisdatum1&=15 ! FTEXT in Baum CMBFORDERUNGBAUM
  16663.   LET cfbetrag1&=16 ! FTEXT in Baum CMBFORDERUNGBAUM
  16664.   LET cfkatalognr2&=18 ! FTEXT in Baum CMBFORDERUNGBAUM
  16665.   LET cfrechtsgrund2&=19 ! FTEXT in Baum CMBFORDERUNGBAUM
  16666.   LET cfrechnungsnr2&=20 ! FTEXT in Baum CMBFORDERUNGBAUM
  16667.   LET cfabdatum2&=21 ! FTEXT in Baum CMBFORDERUNGBAUM
  16668.   LET cfbisdatum2&=22 ! FTEXT in Baum CMBFORDERUNGBAUM
  16669.   LET cfbetrag2&=23 ! FTEXT in Baum CMBFORDERUNGBAUM
  16670.   LET cfkatalognr3&=25 ! FTEXT in Baum CMBFORDERUNGBAUM
  16671.   LET cfrechtsgrund3&=26 ! FTEXT in Baum CMBFORDERUNGBAUM
  16672.   LET cfrechnungsnr3&=27 ! FTEXT in Baum CMBFORDERUNGBAUM
  16673.   LET cfabdatum3&=28 ! FTEXT in Baum CMBFORDERUNGBAUM
  16674.   LET cfbisdatum3&=29 ! FTEXT in Baum CMBFORDERUNGBAUM
  16675.   LET cfbetrag3&=30 ! FTEXT in Baum CMBFORDERUNGBAUM
  16676.   LET cfkatalognrhelp&=31 ! BOXTEXT in Baum CMBFORDERUNGBAUM
  16677.   LET cfplz&=37 ! FTEXT in Baum CMBFORDERUNGBAUM
  16678.   LET cfort&=38 ! FTEXT in Baum CMBFORDERUNGBAUM
  16679.   LET cfauslkz&=39 ! FTEXT in Baum CMBFORDERUNGBAUM
  16680.   LET cfvertragsart&=40 ! FTEXT in Baum CMBFORDERUNGBAUM
  16681.   LET cfsonstigeanspr1&=44 ! FTEXT in Baum CMBFORDERUNGBAUM
  16682.   LET cfsonstigeanspr2&=45 ! FTEXT in Baum CMBFORDERUNGBAUM
  16683.   LET cfsonstigebetrag&=47 ! FTEXT in Baum CMBFORDERUNGBAUM
  16684.   LET cfzinsturnuspop1&=53 ! BOXTEXT in Baum CMBFORDERUNGBAUM
  16685.   LET cfzinshfzeile1&=58 ! FTEXT in Baum CMBFORDERUNGBAUM
  16686.   LET cfnormalzins1&=59 ! FTEXT in Baum CMBFORDERUNGBAUM
  16687.   LET cfdiskontzins1&=60 ! FTEXT in Baum CMBFORDERUNGBAUM
  16688.   LET cfzinsbasis1&=61 ! FTEXT in Baum CMBFORDERUNGBAUM
  16689.   LET cfzinsstart1&=62 ! FTEXT in Baum CMBFORDERUNGBAUM
  16690.   LET cfzinsende1&=63 ! FTEXT in Baum CMBFORDERUNGBAUM
  16691.   LET cfzinsturnuspop2&=64 ! BOXTEXT in Baum CMBFORDERUNGBAUM
  16692.   LET cfzinshfzeile2&=66 ! FTEXT in Baum CMBFORDERUNGBAUM
  16693.   LET cfnormalzins2&=67 ! FTEXT in Baum CMBFORDERUNGBAUM
  16694.   LET cfdiskontzins2&=68 ! FTEXT in Baum CMBFORDERUNGBAUM
  16695.   LET cfzinsbasis2&=69 ! FTEXT in Baum CMBFORDERUNGBAUM
  16696.   LET cfzinsstart2&=70 ! FTEXT in Baum CMBFORDERUNGBAUM
  16697.   LET cfzinsende2&=71 ! FTEXT in Baum CMBFORDERUNGBAUM
  16698.   LET cfzinsturnuspop3&=72 ! BOXTEXT in Baum CMBFORDERUNGBAUM
  16699.   LET cfzinshfzeile3&=74 ! FTEXT in Baum CMBFORDERUNGBAUM
  16700.   LET cfnormalzins3&=75 ! FTEXT in Baum CMBFORDERUNGBAUM
  16701.   LET cfdiskontzins3&=76 ! FTEXT in Baum CMBFORDERUNGBAUM
  16702.   LET cfzinsbasis3&=77 ! FTEXT in Baum CMBFORDERUNGBAUM
  16703.   LET cfzinsstart3&=78 ! FTEXT in Baum CMBFORDERUNGBAUM
  16704.   LET cfzinsende3&=79 ! FTEXT in Baum CMBFORDERUNGBAUM
  16705.   LET cfausgerzinsab&=82 ! FTEXT in Baum CMBFORDERUNGBAUM
  16706.   LET cfausgerzinsbis&=84 ! FTEXT in Baum CMBFORDERUNGBAUM
  16707.   LET cfausgerzinsbetr&=86 ! FTEXT in Baum CMBFORDERUNGBAUM
  16708.   LET cfauslagen&=90 ! FTEXT in Baum CMBFORDERUNGBAUM
  16709.   LET cfsonstauslagenb&=94 ! FTEXT in Baum CMBFORDERUNGBAUM
  16710.   LET cfsonstauslagenn&=96 ! FTEXT in Baum CMBFORDERUNGBAUM
  16711.   LET cfok&=97 ! BUTTON in Baum CMBFORDERUNGBAUM
  16712.   LET cfabbruch&=98 ! BUTTON in Baum CMBFORDERUNGBAUM
  16713.   LET cmbzusatzbaum&=19 ! Formular/Dialog
  16714.   LET czvorsteuerabzug&=4 ! BUTTON in Baum CMBZUSATZBAUM
  16715.   LET czgglabhaengig&=5 ! BUTTON in Baum CMBZUSATZBAUM
  16716.   LET czgglunabhaengig&=6 ! BUTTON in Baum CMBZUSATZBAUM
  16717.   LET czstreitverfahrn&=7 ! BUTTON in Baum CMBZUSATZBAUM
  16718.   LET czgerichtpopup&=9 ! BOXTEXT in Baum CMBZUSATZBAUM
  16719.   LET czgerichtplz&=13 ! FTEXT in Baum CMBZUSATZBAUM
  16720.   LET czgerichtort&=14 ! FTEXT in Baum CMBZUSATZBAUM
  16721.   LET czmahngerichtplz&=18 ! FTEXT in Baum CMBZUSATZBAUM
  16722.   LET czmahngerichtort&=19 ! FTEXT in Baum CMBZUSATZBAUM
  16723.   LET czmahnkosten&=21 ! FTEXT in Baum CMBZUSATZBAUM
  16724.   LET czauskuenfte&=22 ! FTEXT in Baum CMBZUSATZBAUM
  16725.   LET czbankruecklast&=23 ! FTEXT in Baum CMBZUSATZBAUM
  16726.   LET czinkassokosten&=24 ! FTEXT in Baum CMBZUSATZBAUM
  16727.   LET czsonstnfdgbetr&=25 ! FTEXT in Baum CMBZUSATZBAUM
  16728.   LET czsonstnfdgname&=26 ! FTEXT in Baum CMBZUSATZBAUM
  16729.   LET czaltglaeubiger&=31 ! FTEXT in Baum CMBZUSATZBAUM
  16730.   LET czabtretungdatum&=32 ! FTEXT in Baum CMBZUSATZBAUM
  16731.   LET czplz&=36 ! FTEXT in Baum CMBZUSATZBAUM
  16732.   LET czort&=37 ! FTEXT in Baum CMBZUSATZBAUM
  16733.   LET czauslkz&=38 ! FTEXT in Baum CMBZUSATZBAUM
  16734.   LET czhfzeile1&=43 ! FTEXT in Baum CMBZUSATZBAUM
  16735.   LET czvertragsdatum1&=44 ! FTEXT in Baum CMBZUSATZBAUM
  16736.   LET czeffektivzins1&=45 ! FTEXT in Baum CMBZUSATZBAUM
  16737.   LET czhfzeile2&=46 ! FTEXT in Baum CMBZUSATZBAUM
  16738.   LET czvertragsdatum2&=47 ! FTEXT in Baum CMBZUSATZBAUM
  16739.   LET czeffektivzins2&=48 ! FTEXT in Baum CMBZUSATZBAUM
  16740.   LET czhfzeile3&=49 ! FTEXT in Baum CMBZUSATZBAUM
  16741.   LET czvertragsdatum3&=50 ! FTEXT in Baum CMBZUSATZBAUM
  16742.   LET czeffektivzins3&=51 ! FTEXT in Baum CMBZUSATZBAUM
  16743.   LET czok&=55 ! BUTTON in Baum CMBZUSATZBAUM
  16744.   LET czabbruch&=56 ! BUTTON in Baum CMBZUSATZBAUM
  16745.   LET cmbhfkatalogbaum&=20 ! Formular/Dialog
  16746.   LET chabisl&=4 ! BUTTON in Baum CMBHFKATALOGBAUM
  16747.   LET chmbiss&=5 ! BUTTON in Baum CMBHFKATALOGBAUM
  16748.   LET chtbisz&=6 ! BUTTON in Baum CMBHFKATALOGBAUM
  16749.   LET chkatfdg3&=7 ! STRING in Baum CMBHFKATALOGBAUM
  16750.   LET chkatfdgpopup3&=8 ! BOXTEXT in Baum CMBHFKATALOGBAUM
  16751.   LET chkatfdg2&=10 ! STRING in Baum CMBHFKATALOGBAUM
  16752.   LET chkatfdgpopup2&=11 ! BOXTEXT in Baum CMBHFKATALOGBAUM
  16753.   LET chkatfdg1&=13 ! STRING in Baum CMBHFKATALOGBAUM
  16754.   LET chkatfdgpopup1&=14 ! BOXTEXT in Baum CMBHFKATALOGBAUM
  16755.   LET chok&=16 ! BUTTON in Baum CMBHFKATALOGBAUM
  16756.   LET chabbruch&=17 ! BUTTON in Baum CMBHFKATALOGBAUM
  16757.   LET datenbankbaum&=21 ! Formular/Dialog
  16758.   LET dbkartpopup&=4 ! FBOXTEXT in Baum DATENBANKBAUM
  16759.   LET dbkdown&=7 ! BOXCHAR in Baum DATENBANKBAUM
  16760.   LET dbkup&=8 ! BOXCHAR in Baum DATENBANKBAUM
  16761.   LET dbkdatensatz&=9 ! BOXTEXT in Baum DATENBANKBAUM
  16762.   LET dbkvorname&=11 ! FTEXT in Baum DATENBANKBAUM
  16763.   LET dbknachname&=13 ! FTEXT in Baum DATENBANKBAUM
  16764.   LET dbkstrasse&=15 ! FTEXT in Baum DATENBANKBAUM
  16765.   LET dbkplzort&=17 ! FTEXT in Baum DATENBANKBAUM
  16766.   LET dbkgf&=19 ! FTEXT in Baum DATENBANKBAUM
  16767.   LET dbktel&=20 ! FTEXT in Baum DATENBANKBAUM
  16768.   LET dbkfax&=21 ! FTEXT in Baum DATENBANKBAUM
  16769.   LET dbkkuerzel&=22 ! FTEXT in Baum DATENBANKBAUM
  16770.   LET dbkspeichern&=23 ! BUTTON in Baum DATENBANKBAUM
  16771.   LET dbkaendern&=24 ! BUTTON in Baum DATENBANKBAUM
  16772.   LET dbkloeschen&=25 ! BUTTON in Baum DATENBANKBAUM
  16773.   LET dbkeintragen&=26 ! BUTTON in Baum DATENBANKBAUM
  16774.   LET dbksuchen&=27 ! BUTTON in Baum DATENBANKBAUM
  16775.   LET dbkabbruch&=28 ! BUTTON in Baum DATENBANKBAUM
  16776. RETURN
  16777. ' **********************************************************************+
  16778. > PROCEDURE init_hnumbers_2
  16779.   REM Resource Datei Indizes für GELDHER2
  16780.   LET h_menu&=0 ! Menuebaum
  16781.   LET desk&=3 ! TITLE in Baum H_MENU
  16782.   LET datei&=4 ! TITLE in Baum H_MENU
  16783.   LET mahnverf&=5 ! TITLE in Baum H_MENU
  16784.   LET standard&=6 ! TITLE in Baum H_MENU
  16785.   LET extras&=7 ! TITLE in Baum H_MENU
  16786.   LET rastinfo&=10 ! STRING in Baum H_MENU
  16787.   LET dneuabrg&=19 ! STRING in Baum H_MENU
  16788.   LET dabrerg&=21 ! STRING in Baum H_MENU
  16789.   LET dzeiloe&=22 ! STRING in Baum H_MENU
  16790.   LET dladen&=23 ! STRING in Baum H_MENU
  16791.   LET ddazulad&=24 ! STRING in Baum H_MENU
  16792.   LET dspeich&=25 ! STRING in Baum H_MENU
  16793.   LET dkurzdr&=26 ! STRING in Baum H_MENU
  16794.   LET dzvdruck&=27 ! STRING in Baum H_MENU
  16795.   LET dende&=29 ! STRING in Baum H_MENU
  16796.   LET mmb&=31 ! STRING in Baum H_MENU
  16797.   LET mvb&=32 ! STRING in Baum H_MENU
  16798.   LET mcommb&=33 ! STRING in Baum H_MENU
  16799.   LET mvoreinst&=35 ! STRING in Baum H_MENU
  16800.   LET mmbmuster&=37 ! STRING in Baum H_MENU
  16801.   LET mstandardmb&=38 ! STRING in Baum H_MENU
  16802.   LET mcmbmuster&=39 ! STRING in Baum H_MENU
  16803.   LET mstandardcmb&=40 ! STRING in Baum H_MENU
  16804.   LET skopien&=42 ! STRING in Baum H_MENU
  16805.   LET sfkey&=43 ! STRING in Baum H_MENU
  16806.   LET sformula&=44 ! STRING in Baum H_MENU
  16807.   LET sstdadr&=45 ! STRING in Baum H_MENU
  16808.   LET svoreins&=46 ! STRING in Baum H_MENU
  16809.   LET sdiskont&=47 ! STRING in Baum H_MENU
  16810.   LET sspeicher&=48 ! STRING in Baum H_MENU
  16811.   LET edatenbank&=50 ! STRING in Baum H_MENU
  16812.   LET edbdazuladen&=51 ! STRING in Baum H_MENU
  16813.   LET ezinsre&=52 ! STRING in Baum H_MENU
  16814.   LET egebrechner&=53 ! STRING in Baum H_MENU
  16815.   LET eordner&=54 ! STRING in Baum H_MENU
  16816.   LET edatloes&=55 ! STRING in Baum H_MENU
  16817.   LET edialpos&=56 ! STRING in Baum H_MENU
  16818.   LET edrckanp&=57 ! STRING in Baum H_MENU
  16819.   LET edruckport&=58 ! STRING in Baum H_MENU
  16820.   LET eoverlay&=59 ! STRING in Baum H_MENU
  16821.   LET edrcktst&=60 ! STRING in Baum H_MENU
  16822.   LET edateikonvert&=61 ! STRING in Baum H_MENU
  16823.   LET popupbaum&=1 ! Formular/Dialog
  16824.   LET fkeypop&=1 ! BOX in Baum POPUPBAUM
  16825.   LET ebenen&=12 ! BOX in Baum POPUPBAUM
  16826.   LET mb_zvpopup&=15 ! BOX in Baum POPUPBAUM
  16827.   LET alertbaum&=2 ! Formular/Dialog
  16828.   LET infobaum&=3 ! Formular/Dialog
  16829.   LET version&=3 ! FTEXT in Baum INFOBAUM
  16830.   LET disknr&=5 ! FTEXT in Baum INFOBAUM
  16831.   LET copyright&=6 ! STRING in Baum INFOBAUM
  16832.   LET user1&=8 ! FTEXT in Baum INFOBAUM
  16833.   LET user2&=9 ! FTEXT in Baum INFOBAUM
  16834.   LET userstr&=10 ! FTEXT in Baum INFOBAUM
  16835.   LET userort&=11 ! FTEXT in Baum INFOBAUM
  16836.   LET userkto&=12 ! FTEXT in Baum INFOBAUM
  16837.   LET userbank&=13 ! FTEXT in Baum INFOBAUM
  16838.   LET userblz&=14 ! FTEXT in Baum INFOBAUM
  16839.   LET infook&=15 ! BUTTON in Baum INFOBAUM
  16840.   LET abbruc15&=16 ! BUTTON in Baum INFOBAUM
  16841.   LET diskontbaum&=4 ! Formular/Dialog
  16842.   LET diskdat&=3 ! FTEXT in Baum DISKONTBAUM
  16843.   LET disksatz&=4 ! FTEXT in Baum DISKONTBAUM
  16844.   LET diskzeil&=7 ! BOXTEXT in Baum DISKONTBAUM
  16845.   LET diskdown&=8 ! BOXCHAR in Baum DISKONTBAUM
  16846.   LET diskup&=9 ! BOXCHAR in Baum DISKONTBAUM
  16847.   LET diskok&=10 ! BUTTON in Baum DISKONTBAUM
  16848.   LET diskloes&=11 ! BUTTON in Baum DISKONTBAUM
  16849.   LET diskabbr&=12 ! BUTTON in Baum DISKONTBAUM
  16850.   LET stdadrbaum&=5 ! Formular/Dialog
  16851.   LET sadname1&=3 ! FTEXT in Baum STDADRBAUM
  16852.   LET sadname2&=4 ! FTEXT in Baum STDADRBAUM
  16853.   LET sadstr&=5 ! FTEXT in Baum STDADRBAUM
  16854.   LET sadort&=6 ! FTEXT in Baum STDADRBAUM
  16855.   LET fertig12&=7 ! BUTTON in Baum STDADRBAUM
  16856.   LET abruch12&=8 ! BUTTON in Baum STDADRBAUM
  16857.   LET kopienbaum&=6 ! Formular/Dialog
  16858.   LET dwnzva&=4 ! BUTTON in Baum KOPIENBAUM
  16859.   LET kzva&=5 ! FTEXT in Baum KOPIENBAUM
  16860.   LET upzva&=6 ! BUTTON in Baum KOPIENBAUM
  16861.   LET dwn367&=8 ! BUTTON in Baum KOPIENBAUM
  16862.   LET k367&=9 ! FTEXT in Baum KOPIENBAUM
  16863.   LET up367&=10 ! BUTTON in Baum KOPIENBAUM
  16864.   LET dwnpfueb&=12 ! BUTTON in Baum KOPIENBAUM
  16865.   LET kpfueb&=13 ! FTEXT in Baum KOPIENBAUM
  16866.   LET uppfueb&=14 ! BUTTON in Baum KOPIENBAUM
  16867.   LET dwnzahlv&=16 ! BUTTON in Baum KOPIENBAUM
  16868.   LET kzahlver&=17 ! FTEXT in Baum KOPIENBAUM
  16869.   LET upzahlve&=18 ! BUTTON in Baum KOPIENBAUM
  16870.   LET dwneva&=20 ! BUTTON in Baum KOPIENBAUM
  16871.   LET keva&=21 ! FTEXT in Baum KOPIENBAUM
  16872.   LET upeva&=22 ! BUTTON in Baum KOPIENBAUM
  16873.   LET dwn840&=24 ! BUTTON in Baum KOPIENBAUM
  16874.   LET k840&=25 ! FTEXT in Baum KOPIENBAUM
  16875.   LET up840&=26 ! BUTTON in Baum KOPIENBAUM
  16876.   LET dwnpfver&=28 ! BUTTON in Baum KOPIENBAUM
  16877.   LET kpfverh&=29 ! FTEXT in Baum KOPIENBAUM
  16878.   LET uppfverh&=30 ! BUTTON in Baum KOPIENBAUM
  16879.   LET dwnpanfr&=32 ! BUTTON in Baum KOPIENBAUM
  16880.   LET kpanfr&=33 ! FTEXT in Baum KOPIENBAUM
  16881.   LET uppanfr&=34 ! BUTTON in Baum KOPIENBAUM
  16882.   LET dwndurch&=36 ! BUTTON in Baum KOPIENBAUM
  16883.   LET kdurchs&=37 ! FTEXT in Baum KOPIENBAUM
  16884.   LET updurchs&=38 ! BUTTON in Baum KOPIENBAUM
  16885.   LET dwnema&=40 ! BUTTON in Baum KOPIENBAUM
  16886.   LET kema&=41 ! FTEXT in Baum KOPIENBAUM
  16887.   LET upema&=42 ! BUTTON in Baum KOPIENBAUM
  16888.   LET dwndroh&=44 ! BUTTON in Baum KOPIENBAUM
  16889.   LET kzvdrohg&=45 ! FTEXT in Baum KOPIENBAUM
  16890.   LET updroh&=46 ! BUTTON in Baum KOPIENBAUM
  16891.   LET dwnsihyp&=48 ! BUTTON in Baum KOPIENBAUM
  16892.   LET ksihyp&=49 ! FTEXT in Baum KOPIENBAUM
  16893.   LET upsihyp&=50 ! BUTTON in Baum KOPIENBAUM
  16894.   LET dwnvgl&=52 ! BUTTON in Baum KOPIENBAUM
  16895.   LET kratenvg&=53 ! FTEXT in Baum KOPIENBAUM
  16896.   LET upvgl&=54 ! BUTTON in Baum KOPIENBAUM
  16897.   LET dwnsivst&=56 ! BUTTON in Baum KOPIENBAUM
  16898.   LET ksivstr&=57 ! FTEXT in Baum KOPIENBAUM
  16899.   LET upsivstr&=58 ! BUTTON in Baum KOPIENBAUM
  16900.   LET fertig17&=59 ! BUTTON in Baum KOPIENBAUM
  16901.   LET abbruc17&=60 ! BUTTON in Baum KOPIENBAUM
  16902.   LET defkeybaum&=7 ! Formular/Dialog
  16903.   LET ktaste&=3 ! STRING in Baum DEFKEYBAUM
  16904.   LET ktastenpopup&=4 ! FBOXTEXT in Baum DEFKEYBAUM
  16905.   LET ktastencycle&=5 ! BOXCHAR in Baum DEFKEYBAUM
  16906.   LET kebene&=6 ! STRING in Baum DEFKEYBAUM
  16907.   LET kebenepopup&=7 ! FBOXTEXT in Baum DEFKEYBAUM
  16908.   LET kebenecycle&=8 ! BOXCHAR in Baum DEFKEYBAUM
  16909.   LET kbelegung&=9 ! FTEXT in Baum DEFKEYBAUM
  16910.   LET kok&=10 ! BUTTON in Baum DEFKEYBAUM
  16911.   LET kweiter&=11 ! BUTTON in Baum DEFKEYBAUM
  16912.   LET kabbruch&=12 ! BUTTON in Baum DEFKEYBAUM
  16913.   LET voreinstbaum&=8 ! Formular/Dialog
  16914.   LET mwstsatz&=3 ! FTEXT in Baum VOREINSTBAUM
  16915.   LET gebpanfr&=6 ! FTEXT in Baum VOREINSTBAUM
  16916.   LET gebema&=8 ! FTEXT in Baum VOREINSTBAUM
  16917.   LET gkzust&=10 ! FTEXT in Baum VOREINSTBAUM
  16918.   LET gkpfueb&=12 ! FTEXT in Baum VOREINSTBAUM
  16919.   LET gkev&=14 ! FTEXT in Baum VOREINSTBAUM
  16920.   LET evwert&=16 ! FTEXT in Baum VOREINSTBAUM
  16921.   LET verrart1&=21 ! BUTTON in Baum VOREINSTBAUM
  16922.   LET verrart2&=22 ! BUTTON in Baum VOREINSTBAUM
  16923.   LET verrart3&=23 ! BUTTON in Baum VOREINSTBAUM
  16924.   LET verrart1std&=25 ! BUTTON in Baum VOREINSTBAUM
  16925.   LET verrart2std&=26 ! BUTTON in Baum VOREINSTBAUM
  16926.   LET verrart3std&=27 ! BUTTON in Baum VOREINSTBAUM
  16927.   LET fertig19&=43 ! BUTTON in Baum VOREINSTBAUM
  16928.   LET abbruc19&=44 ! BUTTON in Baum VOREINSTBAUM
  16929.   LET formularbaum&=9 ! Formular/Dialog
  16930.   LET ffuer&=3 ! STRING in Baum FORMULARBAUM
  16931.   LET fpopup&=4 ! BOXTEXT in Baum FORMULARBAUM
  16932.   LET fcycle&=5 ! BOXCHAR in Baum FORMULARBAUM
  16933.   LET flaenge&=6 ! FTEXT in Baum FORMULARBAUM
  16934.   LET forand&=7 ! FTEXT in Baum FORMULARBAUM
  16935.   LET forandad&=8 ! FTEXT in Baum FORMULARBAUM
  16936.   LET furand&=9 ! FTEXT in Baum FORMULARBAUM
  16937.   LET fbreite&=10 ! FTEXT in Baum FORMULARBAUM
  16938.   LET flrand&=11 ! FTEXT in Baum FORMULARBAUM
  16939.   LET furandfz&=12 ! FTEXT in Baum FORMULARBAUM
  16940.   LET snrlinks&=14 ! BUTTON in Baum FORMULARBAUM
  16941.   LET snrzentriert&=15 ! BUTTON in Baum FORMULARBAUM
  16942.   LET snrrechts&=16 ! BUTTON in Baum FORMULARBAUM
  16943.   LET unterschrift&=17 ! FTEXT in Baum FORMULARBAUM
  16944.   LET fertig13&=18 ! BUTTON in Baum FORMULARBAUM
  16945.   LET abbruc13&=19 ! BUTTON in Baum FORMULARBAUM
  16946.   LET dialogboxbaum&=10 ! Formular/Dialog
  16947.   LET dbzentriert&=4 ! BUTTON in Baum DIALOGBOXBAUM
  16948.   LET dbmausabhaengig&=5 ! BUTTON in Baum DIALOGBOXBAUM
  16949.   LET dbalsbox&=7 ! BUTTON in Baum DIALOGBOXBAUM
  16950.   LET dbalsfenster&=8 ! BUTTON in Baum DIALOGBOXBAUM
  16951.   LET dbok&=9 ! BUTTON in Baum DIALOGBOXBAUM
  16952.   LET dbabbruch&=10 ! BUTTON in Baum DIALOGBOXBAUM
  16953.   LET overlaybaum&=11 ! Formular/Dialog
  16954.   LET ovdateiname&=4 ! STRING in Baum OVERLAYBAUM
  16955.   LET ovdateipfad&=5 ! FTEXT in Baum OVERLAYBAUM
  16956.   LET ovdateilaenge&=6 ! FTEXT in Baum OVERLAYBAUM
  16957.   LET ovffposition&=7 ! FTEXT in Baum OVERLAYBAUM
  16958.   LET ovspeicher&=8 ! FTEXT in Baum OVERLAYBAUM
  16959.   LET oveinleitung&=10 ! FTEXT in Baum OVERLAYBAUM
  16960.   LET ovnachspann&=11 ! FTEXT in Baum OVERLAYBAUM
  16961.   LET ovok&=12 ! BUTTON in Baum OVERLAYBAUM
  16962.   LET ovabbruch&=13 ! BUTTON in Baum OVERLAYBAUM
  16963.   LET ovsenden&=14 ! BUTTON in Baum OVERLAYBAUM
  16964.   LET druckanpbaum&=12 ! Formular/Dialog
  16965.   LET drname&=3 ! FTEXT in Baum DRUCKANPBAUM
  16966.   LET pgrossae&=5 ! BUTTON in Baum DRUCKANPBAUM
  16967.   LET pkleinae&=6 ! BUTTON in Baum DRUCKANPBAUM
  16968.   LET pfettein&=7 ! BUTTON in Baum DRUCKANPBAUM
  16969.   LET pcpi10&=8 ! BUTTON in Baum DRUCKANPBAUM
  16970.   LET pinitial&=9 ! BUTTON in Baum DRUCKANPBAUM
  16971.   LET pgrossoe&=10 ! BUTTON in Baum DRUCKANPBAUM
  16972.   LET pkleinoe&=11 ! BUTTON in Baum DRUCKANPBAUM
  16973.   LET pfettaus&=12 ! BUTTON in Baum DRUCKANPBAUM
  16974.   LET pcpi12&=13 ! BUTTON in Baum DRUCKANPBAUM
  16975.   LET pnachsp&=14 ! BUTTON in Baum DRUCKANPBAUM
  16976.   LET pgrossue&=15 ! BUTTON in Baum DRUCKANPBAUM
  16977.   LET pkleinue&=16 ! BUTTON in Baum DRUCKANPBAUM
  16978.   LET puntein&=17 ! BUTTON in Baum DRUCKANPBAUM
  16979.   LET pcpi15&=18 ! BUTTON in Baum DRUCKANPBAUM
  16980.   LET pschacht&=19 ! BUTTON in Baum DRUCKANPBAUM
  16981.   LET pparagr&=20 ! BUTTON in Baum DRUCKANPBAUM
  16982.   LET psz&=21 ! BUTTON in Baum DRUCKANPBAUM
  16983.   LET puntaus&=22 ! BUTTON in Baum DRUCKANPBAUM
  16984.   LET pff&=23 ! BUTTON in Baum DRUCKANPBAUM
  16985.   LET pkopien&=24 ! BUTTON in Baum DRUCKANPBAUM
  16986.   LET plrand&=25 ! BUTTON in Baum DRUCKANPBAUM
  16987.   LET pseitenlaenge&=26 ! BUTTON in Baum DRUCKANPBAUM
  16988.   LET poverlay&=27 ! BUTTON in Baum DRUCKANPBAUM
  16989.   LET pbefehl&=28 ! FTEXT in Baum DRUCKANPBAUM
  16990.   LET pok&=29 ! BUTTON in Baum DRUCKANPBAUM
  16991.   LET pdrladen&=30 ! BUTTON in Baum DRUCKANPBAUM
  16992.   LET pdrspei&=31 ! BUTTON in Baum DRUCKANPBAUM
  16993.   LET pabbruch&=32 ! BUTTON in Baum DRUCKANPBAUM
  16994.   LET zinsrechbaum&=13 ! Formular/Dialog
  16995.   LET zprozent&=3 ! FTEXT in Baum ZINSRECHBAUM
  16996.   LET zzinstxt&=4 ! TEXT in Baum ZINSRECHBAUM
  16997.   LET zscheckz&=5 ! BUTTON in Baum ZINSRECHBAUM
  16998.   LET zbetrag&=6 ! FTEXT in Baum ZINSRECHBAUM
  16999.   LET zabdat&=7 ! FTEXT in Baum ZINSRECHBAUM
  17000.   LET zbisdat&=8 ! FTEXT in Baum ZINSRECHBAUM
  17001.   LET zberechn&=9 ! BUTTON in Baum ZINSRECHBAUM
  17002.   LET zzinstag&=10 ! FTEXT in Baum ZINSRECHBAUM
  17003.   LET zkalendertage&=11 ! FTEXT in Baum ZINSRECHBAUM
  17004.   LET zibetrag&=12 ! FTEXT in Baum ZINSRECHBAUM
  17005.   LET zfertig&=13 ! BUTTON in Baum ZINSRECHBAUM
  17006.   LET mbvoreinstbaum&=14 ! Formular/Dialog
  17007.   LET mbvwestgeb&=5 ! BUTTON in Baum MBVOREINSTBAUM
  17008.   LET mbvostgeb&=6 ! BUTTON in Baum MBVOREINSTBAUM
  17009.   LET mbvkeinegeb&=7 ! BUTTON in Baum MBVOREINSTBAUM
  17010.   LET mbvmwst&=8 ! BUTTON in Baum MBVOREINSTBAUM
  17011.   LET mbvok&=10 ! BUTTON in Baum MBVOREINSTBAUM
  17012.   LET mbvabbruch&=11 ! BUTTON in Baum MBVOREINSTBAUM
  17013.   LET eigensache&=12 ! FTEXT in Baum MBVOREINSTBAUM
  17014.   LET termwahlbaum&=15 ! Formular/Dialog
  17015.   LET heute&=4 ! BUTTON in Baum TERMWAHLBAUM
  17016.   LET aktwoche&=5 ! BUTTON in Baum TERMWAHLBAUM
  17017.   LET aktmonat&=6 ! BUTTON in Baum TERMWAHLBAUM
  17018.   LET aktjahr&=7 ! BUTTON in Baum TERMWAHLBAUM
  17019.   LET morgen&=8 ! BUTTON in Baum TERMWAHLBAUM
  17020.   LET nxtwoche&=9 ! BUTTON in Baum TERMWAHLBAUM
  17021.   LET nxtmonat&=10 ! BUTTON in Baum TERMWAHLBAUM
  17022.   LET alle&=11 ! BUTTON in Baum TERMWAHLBAUM
  17023.   LET abtermin&=12 ! FTEXT in Baum TERMWAHLBAUM
  17024.   LET bistermn&=13 ! FTEXT in Baum TERMWAHLBAUM
  17025.   LET geschftl&=14 ! BUTTON in Baum TERMWAHLBAUM
  17026.   LET privat&=15 ! BUTTON in Baum TERMWAHLBAUM
  17027.   LET fertig20&=16 ! BUTTON in Baum TERMWAHLBAUM
  17028.   LET abbruc20&=17 ! BUTTON in Baum TERMWAHLBAUM
  17029.   LET termeingbaum&=16 ! Formular/Dialog
  17030.   LET termdat&=2 ! FTEXT in Baum TERMEINGBAUM
  17031.   LET termuhr&=3 ! FTEXT in Baum TERMEINGBAUM
  17032.   LET pktl&=6 ! BUTTON in Baum TERMEINGBAUM
  17033.   LET priv&=7 ! BUTTON in Baum TERMEINGBAUM
  17034.   LET sat&=8 ! BUTTON in Baum TERMEINGBAUM
  17035.   LET saal&=9 ! FTEXT in Baum TERMEINGBAUM
  17036.   LET termort&=10 ! FTEXT in Baum TERMEINGBAUM
  17037.   LET insachen&=11 ! FTEXT in Baum TERMEINGBAUM
  17038.   LET min15&=14 ! BUTTON in Baum TERMEINGBAUM
  17039.   LET min30&=15 ! BUTTON in Baum TERMEINGBAUM
  17040.   LET min45&=16 ! BUTTON in Baum TERMEINGBAUM
  17041.   LET min60&=17 ! BUTTON in Baum TERMEINGBAUM
  17042.   LET min90&=18 ! BUTTON in Baum TERMEINGBAUM
  17043.   LET termende&=19 ! FTEXT in Baum TERMEINGBAUM
  17044.   LET endzeit&=20 ! FTEXT in Baum TERMEINGBAUM
  17045.   LET fertig21&=22 ! BUTTON in Baum TERMEINGBAUM
  17046.   LET weiter&=23 ! BUTTON in Baum TERMEINGBAUM
  17047.   LET abbruc21&=24 ! BUTTON in Baum TERMEINGBAUM
  17048.   LET gebuehrinfobaum&=17 ! Formular/Dialog
  17049.   LET pfeilbox&=3 ! BOX in Baum GEBUEHRINFOBAUM
  17050.   LET pf_inf&=4 ! TEXT in Baum GEBUEHRINFOBAUM
  17051.   LET pf_sw&=5 ! TEXT in Baum GEBUEHRINFOBAUM
  17052.   LET pf_pkh&=6 ! TEXT in Baum GEBUEHRINFOBAUM
  17053.   LET pf_3&=7 ! TEXT in Baum GEBUEHRINFOBAUM
  17054.   LET pf_5&=8 ! TEXT in Baum GEBUEHRINFOBAUM
  17055.   LET pf_7&=9 ! TEXT in Baum GEBUEHRINFOBAUM
  17056.   LET pf_10&=10 ! TEXT in Baum GEBUEHRINFOBAUM
  17057.   LET pf_13&=11 ! TEXT in Baum GEBUEHRINFOBAUM
  17058.   LET pf_copy&=12 ! TEXT in Baum GEBUEHRINFOBAUM
  17059.   LET pf_km&=13 ! TEXT in Baum GEBUEHRINFOBAUM
  17060.   LET pf_mwst&=14 ! TEXT in Baum GEBUEHRINFOBAUM
  17061.   LET pf_gk1&=15 ! TEXT in Baum GEBUEHRINFOBAUM
  17062.   LET pf_gk5&=16 ! TEXT in Baum GEBUEHRINFOBAUM
  17063.   LET pf_zust&=17 ! TEXT in Baum GEBUEHRINFOBAUM
  17064.   LET pf_verau&=18 ! TEXT in Baum GEBUEHRINFOBAUM
  17065.   LET infdatei&=20 ! FTEXT in Baum GEBUEHRINFOBAUM
  17066.   LET ostwest&=21 ! FTEXT in Baum GEBUEHRINFOBAUM
  17067.   LET swbox&=22 ! BOX in Baum GEBUEHRINFOBAUM
  17068.   LET swvon&=23 ! STRING in Baum GEBUEHRINFOBAUM
  17069.   LET swnieder&=24 ! FTEXT in Baum GEBUEHRINFOBAUM
  17070.   LET swbis&=25 ! STRING in Baum GEBUEHRINFOBAUM
  17071.   LET swhoch&=26 ! FTEXT in Baum GEBUEHRINFOBAUM
  17072.   LET swdown&=28 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17073.   LET swup&=29 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17074.   LET klickbox&=30 ! IBOX in Baum GEBUEHRINFOBAUM
  17075.   LET pkhbox&=31 ! BOX in Baum GEBUEHRINFOBAUM
  17076.   LET pkhja&=33 ! BUTTON in Baum GEBUEHRINFOBAUM
  17077.   LET pkhnein&=34 ! BUTTON in Baum GEBUEHRINFOBAUM
  17078.   LET down3&=36 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17079.   LET faktor3&=38 ! FTEXT in Baum GEBUEHRINFOBAUM
  17080.   LET up3&=39 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17081.   LET down5&=41 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17082.   LET faktor5&=43 ! FTEXT in Baum GEBUEHRINFOBAUM
  17083.   LET up5&=44 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17084.   LET down7&=46 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17085.   LET faktor7&=48 ! FTEXT in Baum GEBUEHRINFOBAUM
  17086.   LET up7&=49 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17087.   LET down10&=51 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17088.   LET faktor10&=53 ! FTEXT in Baum GEBUEHRINFOBAUM
  17089.   LET up10&=54 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17090.   LET down13&=56 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17091.   LET faktor13&=58 ! FTEXT in Baum GEBUEHRINFOBAUM
  17092.   LET up13&=59 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17093.   LET downcopy&=63 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17094.   LET faktcopy&=65 ! FTEXT in Baum GEBUEHRINFOBAUM
  17095.   LET upcopy&=66 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17096.   LET downkm&=68 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17097.   LET faktkm&=70 ! FTEXT in Baum GEBUEHRINFOBAUM
  17098.   LET upkm&=71 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17099.   LET mwstbox&=73 ! STRING in Baum GEBUEHRINFOBAUM
  17100.   LET mwstja&=74 ! BUTTON in Baum GEBUEHRINFOBAUM
  17101.   LET mwstnein&=75 ! BUTTON in Baum GEBUEHRINFOBAUM
  17102.   LET gk1down&=77 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17103.   LET faktgk1&=79 ! FTEXT in Baum GEBUEHRINFOBAUM
  17104.   LET gk1up&=80 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17105.   LET gk5down&=82 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17106.   LET faktgk5&=84 ! FTEXT in Baum GEBUEHRINFOBAUM
  17107.   LET gk5up&=85 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17108.   LET zustdown&=87 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17109.   LET faktzust&=89 ! FTEXT in Baum GEBUEHRINFOBAUM
  17110.   LET zustup&=90 ! BOXCHAR in Baum GEBUEHRINFOBAUM
  17111.   LET verauslg&=92 ! FTEXT in Baum GEBUEHRINFOBAUM
  17112.   LET swgenau&=93 ! FTEXT in Baum GEBUEHRINFOBAUM
  17113.   LET probox&=95 ! IBOX in Baum GEBUEHRINFOBAUM
  17114.   LET pro3&=96 ! FTEXT in Baum GEBUEHRINFOBAUM
  17115.   LET pro5&=97 ! FTEXT in Baum GEBUEHRINFOBAUM
  17116.   LET pro7&=98 ! FTEXT in Baum GEBUEHRINFOBAUM
  17117.   LET pro10&=99 ! FTEXT in Baum GEBUEHRINFOBAUM
  17118.   LET pro13&=100 ! FTEXT in Baum GEBUEHRINFOBAUM
  17119.   LET zwisumme&=101 ! FTEXT in Baum GEBUEHRINFOBAUM
  17120.   LET progk1&=102 ! FTEXT in Baum GEBUEHRINFOBAUM
  17121.   LET progk5&=103 ! FTEXT in Baum GEBUEHRINFOBAUM
  17122.   LET prozust&=104 ! FTEXT in Baum GEBUEHRINFOBAUM
  17123.   LET summe3&=106 ! FTEXT in Baum GEBUEHRINFOBAUM
  17124.   LET summe5&=109 ! FTEXT in Baum GEBUEHRINFOBAUM
  17125.   LET summe7&=112 ! FTEXT in Baum GEBUEHRINFOBAUM
  17126.   LET summe10&=115 ! FTEXT in Baum GEBUEHRINFOBAUM
  17127.   LET summe13&=118 ! FTEXT in Baum GEBUEHRINFOBAUM
  17128.   LET sumauslg&=121 ! FTEXT in Baum GEBUEHRINFOBAUM
  17129.   LET sumcopy&=124 ! FTEXT in Baum GEBUEHRINFOBAUM
  17130.   LET sumkm&=127 ! FTEXT in Baum GEBUEHRINFOBAUM
  17131.   LET summwst&=130 ! FTEXT in Baum GEBUEHRINFOBAUM
  17132.   LET summegk1&=133 ! FTEXT in Baum GEBUEHRINFOBAUM
  17133.   LET summegk5&=136 ! FTEXT in Baum GEBUEHRINFOBAUM
  17134.   LET sumzust&=139 ! FTEXT in Baum GEBUEHRINFOBAUM
  17135.   LET proauslg&=140 ! FTEXT in Baum GEBUEHRINFOBAUM
  17136.   LET sumverau&=142 ! FTEXT in Baum GEBUEHRINFOBAUM
  17137.   LET bedienhoch&=144 ! STRING in Baum GEBUEHRINFOBAUM
  17138.   LET bedienplus&=145 ! STRING in Baum GEBUEHRINFOBAUM
  17139.   LET bedienrunter&=146 ! STRING in Baum GEBUEHRINFOBAUM
  17140.   LET bedienminus&=147 ! STRING in Baum GEBUEHRINFOBAUM
  17141.   LET gessumme&=148 ! FBOXTEXT in Baum GEBUEHRINFOBAUM
  17142.   LET zuclipb&=149 ! BUTTON in Baum GEBUEHRINFOBAUM
  17143.   LET abbruch&=150 ! BUTTON in Baum GEBUEHRINFOBAUM
  17144.   LET loeschbaum&=18 ! Formular/Dialog
  17145.   LET zeilenr&=4 ! FTEXT in Baum LOESCHBAUM
  17146.   LET zok&=5 ! BUTTON in Baum LOESCHBAUM
  17147.   LET zabbruch&=6 ! BUTTON in Baum LOESCHBAUM
  17148.   LET druckportbaum&=19 ! Formular/Dialog
  17149.   LET dpparallel&=4 ! BUTTON in Baum DRUCKPORTBAUM
  17150.   LET dpseriell&=5 ! BUTTON in Baum DRUCKPORTBAUM
  17151.   LET dpok&=6 ! BUTTON in Baum DRUCKPORTBAUM
  17152.   LET dpabbruch&=7 ! BUTTON in Baum DRUCKPORTBAUM
  17153.   LET vbbaum&=20 ! Formular/Dialog
  17154.   LET vbobigebetraege&=4 ! BUTTON in Baum VBBAUM
  17155.   LET vbhfsum1&=5 ! FTEXT in Baum VBBAUM
  17156.   LET vbteilbetrag&=6 ! BUTTON in Baum VBBAUM
  17157.   LET vbhfsum2&=7 ! FTEXT in Baum VBBAUM
  17158.   LET vbzahlungsbox&=8 ! BUTTON in Baum VBBAUM
  17159.   LET vbzahlgdatum1&=10 ! FTEXT in Baum VBBAUM
  17160.   LET vbzahlung1&=11 ! FTEXT in Baum VBBAUM
  17161.   LET vbzahlgcheck1&=12 ! BUTTON in Baum VBBAUM
  17162.   LET vbzahlgdatum2&=13 ! FTEXT in Baum VBBAUM
  17163.   LET vbzahlung2&=14 ! FTEXT in Baum VBBAUM
  17164.   LET vbzahlgcheck2&=15 ! BUTTON in Baum VBBAUM
  17165.   LET vbzahlgdatum3&=16 ! FTEXT in Baum VBBAUM
  17166.   LET vbzahlung3&=17 ! FTEXT in Baum VBBAUM
  17167.   LET vbzahlgcheck3&=18 ! BUTTON in Baum VBBAUM
  17168.   LET vbgk&=21 ! FTEXT in Baum VBBAUM
  17169.   LET vbgebuehren&=24 ! FTEXT in Baum VBBAUM
  17170.   LET vbwestost&=25 ! FTEXT in Baum VBBAUM
  17171.   LET vbauslagen&=27 ! FTEXT in Baum VBBAUM
  17172.   LET vbmwst&=30 ! FTEXT in Baum VBBAUM
  17173.   LET vbsumme&=34 ! FTEXT in Baum VBBAUM
  17174.   LET vbdazubuchen&=35 ! BUTTON in Baum VBBAUM
  17175.   LET vbkeinezahlung&=37 ! BUTTON in Baum VBBAUM
  17176.   LET vbobigezahlung&=38 ! BUTTON in Baum VBBAUM
  17177.   LET vbzustgericht&=40 ! BUTTON in Baum VBBAUM
  17178.   LET vbzustpartei&=41 ! BUTTON in Baum VBBAUM
  17179.   LET vbdrucken&=42 ! BUTTON in Baum VBBAUM
  17180.   LET vbdatum&=43 ! FTEXT in Baum VBBAUM
  17181.   LET vbok&=44 ! BUTTON in Baum VBBAUM
  17182.   LET vbabbruch&=45 ! BUTTON in Baum VBBAUM
  17183.   LET konvertbaum&=21 ! Formular/Dialog
  17184.   LET ko_qpfadauswahl&=4 ! STRING in Baum KONVERTBAUM
  17185.   LET ko_quellpfad&=5 ! FTEXT in Baum KONVERTBAUM
  17186.   LET ko_zpfadauswahl&=6 ! STRING in Baum KONVERTBAUM
  17187.   LET ko_zielpfad&=7 ! FTEXT in Baum KONVERTBAUM
  17188.   LET ko_ok&=8 ! BUTTON in Baum KONVERTBAUM
  17189.   LET ko_abbruch&=9 ! BUTTON in Baum KONVERTBAUM
  17190.   LET konvinfobaum&=22 ! Formular/Dialog
  17191.   LET ki_quellpfad&=5 ! FTEXT in Baum KONVINFOBAUM
  17192.   LET ki_zielpfad&=6 ! FTEXT in Baum KONVINFOBAUM
  17193.   LET speicherbaum&=23 ! Formular/Dialog
  17194.   LET sebuchungen&=3 ! FTEXT in Baum SPEICHERBAUM
  17195.   LET sedatensaetze&=4 ! FTEXT in Baum SPEICHERBAUM
  17196.   LET seprgverfuegbar&=6 ! FTEXT in Baum SPEICHERBAUM
  17197.   LET sesysverfuegbar&=7 ! FTEXT in Baum SPEICHERBAUM
  17198.   LET seok&=8 ! BUTTON in Baum SPEICHERBAUM
  17199.   LET seabbruch&=9 ! BUTTON in Baum SPEICHERBAUM
  17200. RETURN
  17201. ' ********************************************************************
  17202.